【问题标题】:How to print file details of files matching grep pattern如何打印匹配 grep 模式的文件的文件详细信息
【发布时间】:2017-01-01 21:20:57
【问题描述】:

我想打印文件详细信息以及 grep 输出,但无法这样做。例如,对于命令

grep 3456 A.txt

我得到输出

A.txt

但想要输出

-rw-rw-r-- 1 tarun tarun   41356911 Aug 25 01:31 A.txt

我尝试了以下方法但没有成功:

  1. grep 34567 A.txt | xargs ls -tlr

  2. grep 34567 A.txt | while read line ; do echo "$line" | date %s.%N ; done

  3. grep -Hr 34567 A.txt | awk -F: '{"stat -c %z "$1 | getline r; print r": "$0 }'

  4. grep 34567 A.txt | awk -F: '{"date -r \""$1"\" +\"%F %R\"" | getline d; print d,$0}'

【问题讨论】:

    标签: bash shell loops grep xargs


    【解决方案1】:
    grep -Zl 3456 * | xargs -0 ls -l
    

    使用 GNU grep。选项有:

    • grep -Zxargs -0:用 NULL 字节而不是空格分隔输出名称。这样您就可以处理包含空格的文件名。
    • grep -l: 只打印匹配的文件名
    • ls -l:标准ls 长输出,这似乎是您所要求的。

    在最新的 cygwin 上测试。

    【讨论】:

    • 成功了.. 非常感谢。您提供的插图非常需要。
    【解决方案2】:

    这里不需要xargsfind 可用于运行grep 和运行ls,甚至可以发出ls 样式的输出本身。

    find . -maxdepth 1 -type f \
           -exec grep -q -e '1234567' -- '{}' ';' \
           -exec ls -l {} +
    

    ...或者,甚至更好:

    find . -maxdepth 1 -type f \
           -exec grep -q -e '1234567' -- '{}' ';' \
           -ls
    

    -ls 操作使用类似于ls -l 的输出格式。

    【讨论】: