我有几个目录要重命名: 等等: “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”命令重命名目录?
答案 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