我试图查找文件,然后查找grep
文件中某些字符串的表达式,然后仅获取文件所在的完整目录路径。
find `pwd` -iname '*.py' -type f -exec bash -c "grep -l 'nn'; sed 's[\/](.*)*[\/]/d' {}" \;
但是,该sed
表达式会导致终端挂起,而不是递归地打印出文件并从目录路径中删除文件。
我可以通过以下方式部分实现这一目标:
find `pwd` -iname 'nn*' -type d
但是,这期望目录名称具有nn
而不是nn
文件内部的名称。
答案1
如果您希望路径包含文件名:
shopt -s globstar
grep -l 'nn' **/*.py | xargs realpath
仅获取匹配文件所在的目录:
```bash
shopt -s globstar
grep -l 'nn' **/*.py | xargs realpath | xargs dirname
要删除重复的目录名称:
shopt -s globstar
grep -l 'nn' **/*.py | xargs realpath | xargs dirname | sort -u
如果您有很多.py
文件,您可能会收到“参数列表太长”错误。
在这种情况下,使用 find 作为:
find `pwd` -iname '*.py' | xargs grep -l 'nn' | xargs dirname | sort -u
以上所有内容均假设路径中没有换行符的目录。如果路径中可能存在换行符,请添加注释,我将添加更多解决方案。