【问题标题】:Linux find exec md5sum, only the sum like this (fullpath TAB size TAB mtime TAB ctime TAB md5)Linux find exec md5sum,只有这样的总和(fullpath TAB size TAB mtime TAB ctime TAB md5)
【发布时间】:2017-10-11 05:06:23
【问题描述】:

我想查看 /var/www 中的文件的以下数据: 全路径大小 mtime ctime md5

我运行了以下命令:

find /var/www/ -maxdepth 1 ! -type d -printf '%p\t%s\t%t\t%c\t' -exec md5sum {}  \;

这给了我: (全路径大小 mtime ctime md5 全路径)

/var/www/intranet/admin/tpl/view.tpl.php        1448    Wed Dec 16 18:51:06.0000000000 2015     Fri Sep 15 09:08:36.0805775786 2017     e0b7dacaf7c90fb0fbe7a69c331e36aa  /var/www/intranet/admin/tpl/view.tpl.php

如何过滤最后一个完整路径??????我不想展示它。所有字段都用 TAB 分隔。

我试过了:

find /var/www/  -maxdepth 1 ! -type d -printf '%p\t%s\t%t\t%c\t'
   -exec md5sum {} | awk '{print $1}'\;

我收到错误:“find: missing argument to `-exec'”

find /var/www/ -maxdepth 1 ! -type d -printf '%p\t%s\t%t\t%c\t' -exec md5sum {} + | awk '{print $1}' 

我只得到了 md5sum。

提前致谢!

【问题讨论】:

    标签: find exec md5sum


    【解决方案1】:

    管道 (|) 是一个外壳功能。要获得 shell 功能,需要调用 shell:

    find /var/www -maxdepth 1 ! -type d -printf '%p\t%s\t%t\t%c\t' -exec sh -c 'md5sum "$1" | awk '\''{print $1}'\' MD5 {} \;
    

    或者,如果您更喜欢分散在多行的命令:

    find /var/www \
        -maxdepth 1 \
        ! -type d \
        -printf '%p\t%s\t%t\t%c\t' \
        -exec sh -c 'md5sum "$1" | awk '\''{print $1}'\' MD5 {} \;
    

    注意事项

    1. sh -c somestring 调用一个 shell 并指示它执行somestring 中的任何命令。

    2. sh -c somestring MD5 {} 调用 shell 并执行一些字符串 $0 分配给 MD5 并将 $1 分配给 find 替换 {} 的任何内容。

      $0 仅在 shell 创建错误消息时使用,否则不重要。

    3. 复杂之处在于我们的命令somestring 必须同时包含单引号和双引号,这就是我们需要转义单引号的原因。

      在我们的例子中,我们希望 somestring 是:

      md5sum "$1" | awk '{print $1}'
      

      为了防止主shell 替换$1,我们需要把它放在单引号内。但是,我们不能将单引号放在单引号内。解决方法是将它用于我们的单引号字符串:

      'md5sum "$1" | awk '\''{print $1}'\'
      

    【讨论】:

      猜你喜欢
      • 2021-04-15
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多