![在终端中按掩码获取所有文件的列表](https://linux22.com/image/33970/%E5%9C%A8%E7%BB%88%E7%AB%AF%E4%B8%AD%E6%8C%89%E6%8E%A9%E7%A0%81%E8%8E%B7%E5%8F%96%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E7%9A%84%E5%88%97%E8%A1%A8.png)
我想找到具有定义掩码的文件夹中的所有*.h
,*.cpp
文件,例如*/trunk/src*
.所以,我可以单独查找*.h
和*.cpp
文件:
find . -path "*/trunk/src/*.h"
find . -path "*/trunk/src/*.cpp"
*.h
获取两种类型(和*.cpp
)的文件列表的最佳方法是什么?
PS 我想将列表通过管道传输到grep
.
答案1
您可以使用-o
“或”:
find . -path '*/trunk/src/*.h' -o -path '*/trunk/src/*.cpp'
这与以下相同
find . -path '*/trunk/src/*' \( -name '*.h' -o -name '*.cpp' \)
如果您想对这些文件运行 grep:
find . \( -path '*/trunk/src/*.h' -o -path '*/trunk/src/*.cpp' \) -exec grep PATTERN {} +
或者
find . -path '*/trunk/src/*' \( -name '*.h' -o -name '*.cpp' \) -exec grep PATTERN {} +
答案2
在 bash 中,打开环球星选项以便**
匹配任何级别的子目录。您可以从您的~/.bashrc
.还要打开extglob
选项来激活 ksh 扩展模式。
shopt -s globstar extglob
然后:
grep PATTERN **/trunk/src/**/*.@(h|cpp)
请注意,当您使用 .bashrc 时,4.2 以下的 bash 版本会遵循指向目录的符号链接**
。
Zsh 使这变得更容易,您不需要设置任何选项,只需键入
grep PATTERN **/trunk/src/**/*.(h|cpp)
如果命令行太长,并且您在 Linux 或其他使用 GNU grep 的平台上,您可以使用grep
recurse 而不是 shell 以节省命令行长度。
grep -R --include='*.cpp' --include='*.h' PATTERN **/trunk/src