如何只打印包含某个字符串的文件的文件名部分?

时间:2017-04-26 19:58:17

标签: linux awk grep find

我需要打印出包含字符串“XYZ”的文件名(例如A001.txt)。 我试过这个:
grep -H -R "XYZ" ~/directory/*.txt | cut -d':' -f1

它将输出整个路径(例如~/directory/A001.txt)。我怎样才能使它只输出文件名(例如A001.txt)?

3 个答案:

答案 0 :(得分:3)

为什么哦,为什么GNU的人会给grep一个选项来递归查找文件,因为这是一个非常好的工具,专为这项工作设计并且名字非常明显。叹息...

find . -type f -exec awk '/XYZ/{print gensub(/.*\//,"",1,FILENAME); nextfile}' {} +

以上使用GNU awk,我假设你已经计划使用GNU grep了。

答案 1 :(得分:1)

grep -lr term dir/to/search/ | awk -F'/' '{print $NF}'应该可以解决问题。

-l只列出文件名,包括其目录。

-r递归遍历目录树和指定目录中的所有文件。

这一切都被传递到awk,被告知使用/作为分隔符(文件名中不允许,因此不会像它那样脆)并打印最后一个字段( NF是字段数,因此$NF是最后一个字段)

答案 2 :(得分:1)

grep -Rl "content" | xargs -d '\n' basename -a

这应该可以解决问题,只打印没有路径的文件名。

  

basename 使用任何前导目录组件打印文件名NAME   除去。

     

参考: https://linux.die.net/man/1/basename