使用sed重命名bash中的目录

时间:2015-02-11 20:54:36

标签: bash sed

我有几个目录要重命名: 等等: “duedate-year”目录到“duedate”(仅删除 - 年) “start-year”目录为“start”

这就是我尝试过的:

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

然而它没有成功。是否可以使用“sed”命令重命名目录?

4 个答案:

答案 0 :(得分:2)

您未正确分配awk的结果。它应该在反引号或$(...)内。要处理变量,您需要将echo $CACHE传递给它,而不是使用$CACHE作为文件名参数(它将处理文件的内容)。那条线应该是:

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

这一行应该是:

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

但是根本没有必要使用awk,你可以使用shell变量扩展运算符:

UPDATE=${CACHE%%-year*}

%%year*表示删除与通配符-year*匹配的值的最长尾随部分。

答案 1 :(得分:1)

许多shell解决方案将会工作"对于给定的样本输入集,然后通常由于不带引号的变量,空白处理不正确等等而导致灾难性的爆炸。除非您的文件名包含换行符,否则这应该是安全的(在这种情况下请参阅find -print0和{{1 }}):

xargs -0

答案 2 :(得分:0)

是的,你可以使用烟斗。我这样做:

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的回答如下。

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

答案 3 :(得分:0)

或使用rename命令

rename 's/-year//' *year