bash中的备份文件循环

bash中的备份文件循环,bash,loops,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 虽然这只会更改目录的

我正在编写一个脚本,它获取一个目录,将其中的所有文件复制到一个新目录,然后重命名新目录中的所有文件,以便在扩展名之前在其名称中包含-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
在的
之前,这样循环就不会在这种情况下运行。(否则,您将在
$i
中获得
$dir2/*
,这是不可取的。)

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

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

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

我将在支持它的系统上使用
find
rename

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

由于某些原因,现在我的目录是空的。您的
mv
命令错误,应该是
mv$i$dir2/$e
-您的所有文件现在都应该在当前目录中…我收到以下错误:
mv:无法将'testdir'移动到其自身的子目录,`testdir/i-BACKUPi'
并且新目录中的文件仍然没有被更改。添加了一个关于在空目录下运行此操作的注释,该目录可以执行您描述的那种操作-但是在生成该名称的替换中必须有其他错误。仅供参考--
重命名不是标准,不同的操作系统包含不同版本的命令,使用方法也不同(或者,许多命令根本没有实现)。好的,谢谢大家的提醒!可能不便于携带,但非常实用=)
cp -R "$dir1" "$dir2"
find "$dir2" | xargs rename 's/$/-BACKUP/'