如何查找文件,解析和修改结果,并从命令行排序?

时间:2014-04-02 22:40:25

标签: bash command-line sed awk

以下是我目前在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列排序。

如何修改命令行以产生所需的输出?

2 个答案:

答案 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"' {} \; )"