由于使用“mv”时出现拼写错误,文件夹中的所有文件都消失了

由于使用“mv”时出现拼写错误,文件夹中的所有文件都消失了

我是 bash 新手,我尝试通过以下方式将目录中的所有文件重命名为它们的 md5 校验和。

r@r:~g$ sh
$ for F in *; do
>     mv "$F" "$(md5sum "$i")"
> done
r@r:~/g$ ls
'd458d56dd4ab8c2b335da66e0bcab924  nRUNO5wt3JRN3pBt.mp4'

我打错了,如果我没记错的话,这行mv "$F" "$(md5sum "$i")"应该是mv "$F" "$(md5sum "$F")"。现在文件夹中的所有文件都丢失了,只剩下一个。

文件被删除或移到了别处吗?有办法恢复它们吗?

当我尝试在包含文件“1.p​​ng”的文件夹中重现该情况时,发生了以下情况。

r@r:~/a$ sh
$ for F in *; do
>     mv "$F" "$(md5sum "$i")"
> done
md5sum: '': No such file or directory
mv: cannot move '1.png' to '': No such file or directory

答案1

可能不是。考虑一下你的循环如何“工作”,以及mv执行了哪些命令。

对于第一个文件,你执行

mv the_file "$(md5sum $i)"

但是,由于"$(md5sum "$i")"循环时不会改变,因此下一个文件的命令是:

mv the_2nd_file "$(md5sum "$i")"

替换第一个文件。第一个文件被删除,并且其磁盘块被标记为“空闲”。

第 3 到第 N 个文件也发生同样的事情。剩下的只有最后一个文件,现在名为“ $(md5sum "$i")”。

您有备份吗?

当编写强大/危险的命令应用于一组文件时,请使用echo

for f in * ; do
 echo mv $f "$(md5sum "$i")"
done

就会显示你的错误。

顺便说一句,大写 [AZ] 变量名传统上用于与应用程序通信。如果您在脚本中使用小写 [az] 名称,则永远不会重叠。

相关内容