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

Col*_*ith 3 bash mv

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

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

我打错字了,如果我没记错的话,这行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
Run Code Online (Sandbox Code Playgroud)

wal*_*tor 5

可能不会。考虑循环如何“工作”以及mv执行哪些命令。

对于第一个文件,您执行了

mv the_file "$(md5sum $i)"
Run Code Online (Sandbox Code Playgroud)

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

mv the_2nd_file "$(md5sum "$i")"
Run Code Online (Sandbox Code Playgroud)

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

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

你有备份吗?

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

for f in * ; do
 echo mv $f "$(md5sum "$i")"
done
Run Code Online (Sandbox Code Playgroud)

会显示你的错误。

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