首页 > 解决方案 > 一个线性终端命令,用于将目录中的所有文件重命名为其哈希值

问题描述

我是 bash 循环的新手,并试图将目录中的所有文件重命名为适当的 md5 值。

目录中有 5 个示例文件。出于测试目的,我尝试首先使用以下命令打印目录中所有文件的 md5 哈希,它工作正常。

for i in `ls`; do md5sum $i; done 

输出:

edc47be8af3a7d4d55402ebae9f04f0a  file1
72cf1321d5f3d2e9e1be8abd971f42f5  file2
4b7b590d6d522f6da7e3a9d12d622a07  file3
357af1e7f8141581361ac5d39efa4d89  file4
1445c4c1fb27abd9061ada3b30a18b44  file5

现在我正在尝试通过以下命令使用适当的 md5 哈希重命名每个文件:

for i in `ls`; do mv $i md5sum $i; done

失败的输出:

mv: target 'file1' is not a directory
mv: target 'file2' is not a directory
mv: target 'file3' is not a directory
mv: target 'file4' is not a directory
mv: target 'file5' is not a directory

我在这里想念什么?

标签: linuxbashterminal

解决方案


句法。是的,我给出了错误的语法。

通过对命令的一些试验和错误,我终于想出了正确的语法。

我注意到这md5sum $i给了我 2 列输出。

edc47be8af3a7d4d55402ebae9f04f0a  file1
72cf1321d5f3d2e9e1be8abd971f42f5  file2
4b7b590d6d522f6da7e3a9d12d622a07  file3
357af1e7f8141581361ac5d39efa4d89  file4
1445c4c1fb27abd9061ada3b30a18b44  file5

通过触发第二个命令for i in ls; do mv $i md5sum $i; done,我基本上是在告诉终端执行以下操作:

mv $i md5sum $i 

据我所知,结果是

mv file1 <md5 value> file1  <-- this was the issue. 

我是如何解决这个问题的?

我使用cut命令过滤出所需的值并制作了新的单行代码,如下所示:

for i in `ls`; do mv $i "$(md5sum $i | cut -d " " -f 1)"; done

[编辑] 根据@stark、@choroba 和@tripleee 的另一个答案和评论,最好使用* 而不是ls。

对于*中的我;做 mv $i "$(md5sum $i | cut -d " " -f 1)"; 完毕

@choroba 的回答在这里也是一个很好的补充。将其变成单行需求,以下是他的解决方案:

对于*中的我;做 m=$(md5sum $i); mv "$i" ${m%% *};完成


推荐阅读