linux - 一个线性终端命令,用于将目录中的所有文件重命名为其哈希值
问题描述
我是 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
我在这里想念什么?
解决方案
句法。是的,我给出了错误的语法。
通过对命令的一些试验和错误,我终于想出了正确的语法。
我注意到这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%% *};完成
推荐阅读
- python-3.x - 从 2 点和一个角度得到 tird 的位置
- javascript - 如何将 react.js 文件的 HTML 部分用于另一个 react.js 文件
- reactjs - 是否有任何 eslint 规则可以防止“对象作为 React 子项无效”
- r - 有没有办法在“spatstat”包中使圆盘图的多边形边界不可见?
- javascript - 如何将共享多个属性的公共属性的数据组合在一起
- python - Python 行为 - JSONDecodeError
- android - 减少使用 Mesibo 的 APK 大小
- javascript - 嵌套三元运算符未按预期返回
- python - 将数据框值汇总到其上方的单元格中
- node.js - MeanStack:在 Linux(ubuntu)上被 cors 阻止