以下是我目前在Linux机器上的bash终端中所做的事情的一个例子:
$ find . -type f -name "*.jar" -print0 |xargs -0 md5sum |awk '{print $1,$2}'
5919b38077fa66784365140cc17f027a ./lib/jorbis-0.0.15.jar
5919b38077fa66784365140cc17f027a ./libsrc/jlgui3.0/lib/jorbis.jar
5919b38077fa66784365140cc17f027a ./libsrc/VorbisSPI1.0.3/lib/jorbis-0.0.15.jar
5919b38077fa66784365140cc17f027a ./lib/zip/jlgui3.0/lib/jorbis.jar
5919b38077fa66784365140cc17f027a ./lib/zip/VorbisSPI1.0.2/lib/jorbis-0.0.15.jar
我想修改命令,结果输出为:
5919b38077fa66784365140cc17f027a jorbis.jar ./libsrc/jlgui3.0/lib/jorbis.jar
5919b38077fa66784365140cc17f027a jorbis.jar ./lib/zip/jlgui3.0/lib/jorbis.jar
5919b38077fa66784365140cc17f027a jorbis-0.0.15.jar ./lib/jorbis-0.0.15.jar
5919b38077fa66784365140cc17f027a jorbis-0.0.15.jar ./libsrc/VorbisSPI1.0.3/lib/jorbis-0.0.15.jar
5919b38077fa66784365140cc17f027a jorbis-0.0.15.jar ./lib/zip/VorbisSPI1.0.2/lib/jorbis-0.0.15.jar
请注意,所需的输出应按第1列排序,然后按第2列排序,然后按第3列排序。
如何修改命令行以产生所需的输出?
答案 0 :(得分:3)
我使用awk
代替sed
(在您的示例中不执行任何操作):
find . -type f -name "*.jar" -print0 \
| xargs -0 md5sum \
| sed 's= \(.*\)/\([^/]\+\)$= \2 \1/\2=' \
| sort
我不确定sort -k1,1 -k2,2 -k3,3
是否会给你一个不同的结果(对我来说没有)。
sed正则表达式解释:
Match: \( . * \) / \( [^/] \+ \) $
^ ^ ^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | | | |
Start group 1 | | End group 1 | Start group 2 | At least once | |
Match any char | Slash | End group 2 |
Maybe repeated Not a slash End of line
Group1对应路径,Group2是文件名。
替换只是Group2,space,Group1,斜杠,Group2。
\2 \1/\2
答案 1 :(得分:1)
与-exec
sort <<< "$(find . -type f -name "*.jar" -exec bash -c 'echo "$(md5sum $0 | awk "{print \$1}") ${0##*/} $0"' {} \; )"