我正在编写一个脚本,该脚本获取一个目录,将所有文件从该目录复制到一个新目录,然后重命名新目录中的所有文件,以便在扩展名之前在其名称中包含 -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
尽管这只会更改目录的名称,而不是目录中的所有文件。
我做错了什么,你会怎么处理?
你需要做一些事情:
for i in "$dir2"/*
(请注意,这不会捕获.dotfiles
,并且会枚举文件和目录,因此如果其中任何一个是问题,您可能需要更多逻辑。
如果您预计复制后$dir2
可能为空,请添加:
shopt -s nullglob
在for
之前,以便在这种情况下循环根本不运行。(否则你会从字面上得到$dir2/*
$i
这是不可取的。
mv $i $e
不起作用,因为$e
不包含您构建的路径。尝试:
mv "$i" "$dir2/$e"
(如果您希望文件的名称中包含空格,则应引用所有这些变量。
我会在支持它的系统上使用find
和rename
:
cp -R "$dir1" "$dir2"
find "$dir2" | xargs rename 's/$/-BACKUP/'