bash中的备份文件循环

时间:2012-10-11 18:09:07

标签: bash loops

我正在编写一个带有目录的脚本,将所有文件复制到新目录中,然后重命名新目录中的所有文件,在扩展名之前在其名称中包含-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

虽然这只会更改目录的名称,但不会更改目录中的所有文件。

我做错了什么,你会怎么做?

2 个答案:

答案 0 :(得分:0)

你需要进行一些全球化:

for i in "$dir2"/*

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

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

shopt -s nullglob
for之前

,以便在这种情况下循环根本不运行。 (否则你会在$dir2/*中逐字地得到$i,这是不可取的。)

mv $i $e

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

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

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

答案 1 :(得分:0)

我会在支持它的系统上使用findrename

cp -R "$dir1" "$dir2"
find "$dir2" | xargs rename 's/$/-BACKUP/'