【发布时间】:2017-09-24 09:42:26
【问题描述】:
我需要打印出包含字符串“XYZ”的文件名(例如A001.txt)。
我试过这个:grep -H -R "XYZ" ~/directory/*.txt | cut -d':' -f1
它将输出整个路径(例如~/directory/A001.txt)。我怎样才能让它只输出文件名(例如A001.txt)?
【问题讨论】:
我需要打印出包含字符串“XYZ”的文件名(例如A001.txt)。
我试过这个:grep -H -R "XYZ" ~/directory/*.txt | cut -d':' -f1
它将输出整个路径(例如~/directory/A001.txt)。我怎样才能让它只输出文件名(例如A001.txt)?
【问题讨论】:
为什么,当有一个为这项工作设计的非常好的工具并且名称非常明显时,为什么 GNU 家伙会给 grep 一个递归查找文件的选项。叹息……
find . -type f -exec awk '/XYZ/{print gensub(/.*\//,"",1,FILENAME); nextfile}' {} +
上面使用了 GNU awk,我假设你已经打算使用 GNU grep。
【讨论】:
grep -lr term dir/to/search/ | awk -F'/' '{print $NF}' 应该可以解决问题。
-l 只列出文件名,包括它们的目录。
-r 递归遍历目录树和指定目录中的所有文件。
这一切都被传送到awk,它被告知使用/作为分隔符(不允许在文件名中,所以不要尽可能脆弱)并打印最后一个字段(NF是字段计数,所以$NF 是最后一个字段)
【讨论】:
grep -Rl "content" | xargs -d '\n' basename -a
这应该可以解决问题,只打印不带路径的文件名。
basename 打印带有任何前导目录组件的文件名 NAME 删除。
【讨论】:
-d '\n' 的 GNU 工具,那么你应该一直使用 grep -Z 和 xargs -0。