0

我正在编写一个脚本,该脚本需要一个目录,将其中的所有文件复制到一个新目录,然后重命名新目录中的所有文件,以在其名称中包含 -BACKUP 在扩展名之前。

到目前为止,我有:

dir1=$1
dir2=$2

mkdir $dir2
cp -r $dir1/. $dir2

for i in $dir2
do
file=$(basename "$i")
b=${file%.*}
c=${file#"$stub"}
d=-BACKUP
e=$b$d$c
mv $i $e

done

尽管这只会更改目录的名称,而不是目录中的所有文件。

我做错了什么,您将如何处理?

4

2 回答 2

0

您需要进行一些全局操作:

for i in "$dir2"/*

(请注意,这不会捕获.dotfiles,并且会枚举文件和目录,因此如果其中任何一个有问题,您可能需要更多的逻辑。)

如果您希望$dir2在复制后可能为空,请添加:

shopt -s nullglob

for这种情况下,循环根本不会运行。(否则你会得到$dir2/*字面上$i是不受欢迎的。)

mv $i $e

将不起作用,因为$e它不包含您构建它的方式的路径。尝试:

mv "$i" "$dir2/$e"

(如果您希望文件名称中包含空格,则应引用所有这些变量。)

于 2012-10-11T18:14:26.437 回答
0

我会在支持它的系统上使用find和:rename

cp -R "$dir1" "$dir2"
find "$dir2" | xargs rename 's/$/-BACKUP/'
于 2012-10-11T18:18:59.053 回答