使用 sed 重命名 bash 中的目录

Renaming directories in bash using sed

我有几个目录要重命名: ETC: "duedate-year" 目录到 "duedate" (只删除 -year) "start-year" 目录到 "start"

这是我试过的:

for CACHE in `find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*year" ` ;
do
set UPDATE="awk -F"-year" '{print }' $CACHE" ;
mv $CACHE  $UPDATE
done

但是没有成功。是否可以使用 "sed" 命令重命名目录?

您错误地分配了 awk 的结果。它应该在反引号或 $(...) 内。要处理一个变量,您需要将 echo $CACHE 传递给它,而不是使用 $CACHE 作为文件名参数(这将处理文件的 内容 )。所以那一行应该是:

并且没有使用 set 分配变量,您只需编写 var=value.

所以那一行应该是:

UPDATE=$(echo "$CACHE" | awk -F-year '{print }`)

但是根本不需要为此使用awk,您可以使用shell变量扩展运算符:

UPDATE=${CACHE%%-year*}

%%year* 表示删除与通配符 -year*.

匹配的值的最长尾随部分

是的,您可以使用管道。我这样做:

for DIR in $(find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*year"); do 
    mv "${DIR}" $(echo "${DIR}" | sed -E 's/year//')        
done

需要注意的是,我非常自学,有时会有一些坏习惯...

在咨询 gniourf_gniourf 之后,我发布了一个更强大的版本 (read more),它是下面 Ed Morton 的回答 "code lift"。

find ${DESTINATION_REPO} -maxdepth 1 -type d -name "*-year"|
while IFS= read -r DIR  
do 
    mv "${DIR}" $(echo "${DIR}" | sed -E 's/year//')        
done

或者使用rename命令

rename 's/-year//' *year

许多 shell 解决方案将 "work" 对于给定的样本输入集,然后在以后灾难性地爆炸,通常是由于未引用的变量、空白处理不正确等。这应该是安全的,除非你文件名包含换行符(在这种情况下请参阅 find -print0xargs -0):

find "$DESTINATION_REPO" -maxdepth 1 -type d -name "*-year" |
while IFS= read -r CACHE
do
    mv -- "$CACHE" "${CACHE%-year}"
done