我是 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.png”的文件夹中重现该情况时,发生了以下情况。
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] 名称,则永远不会重叠。