递归查找文件并按与特定子字符串匹配的路径过滤它们

递归查找文件并按与特定子字符串匹配的路径过滤它们

完全的 Linux 新手,需要命令帮助来查找文件名、列出它们各自的路径,然后仅通过包含特定子字符串的路径进一步过滤结果集。

例如,我有一个文件名标识为someFile.txt.该文件名可以存在于多个目录中:

例如/some/directory/path/good/someFile.txt/some/directory/path/bad/someFile.txt

使用 find 我可以返回包含该文件的所有路径的列表,但我也想返回路径名中仅包含“good”的路径。此示例中的白名单是更可取的,因为有许多变量路径名,但我知道包含术语“好”的路径名是可以接受的。

这就是我所拥有的有效方法:

$ find . -type f \( -name someFile1.txt -o -name someFile2.txt\)

我也尝试过以下方法但无济于事:

$ find . -type f \(-name someFile1.txt -o -name someFile2.txt\) -print0 | xargs -0 grep -rl 'good'
$ find . -type f \(-name someFile.txt .... | xargs -0 grep 'good'
$ find . -type f \(-name someFile.txt .... | xargs -0 egrep 'good|real_good'

答案1

使用-path测试find

find . -path '*/good/*' -type f \( -name someFile1.txt -o -name someFile2.txt \)

-path测试的工作方式类似于,但该模式是针对当前正在考虑的-name任何文件的完整路径名进行测试的。find

我使用上面测试的方式将确保仅返回具有名称someFile1.txtsomeFile1.txt位于名为 的目录下某处的文件。goodfind

如果文件应该驻留在good目录中,而不是位于其下的子目录中,则使用

find . -type f \( -path '*/good/someFile1.txt' -o -path '*/good/someFile2.txt' \)

或类似的东西。

显然,如果您正在寻找名为someFile1.txt和 的实际文件someFile2.txt,您将使用该模式someFile[12].txt而不是两个单独的测试。

从评论中,很明显您可能想要使用

find . -type f \
    \( -ipath '*realgood*' -o -ipath '*real_good*' \) \
    \( -name someFile1.txt -o -name someFile2.txt  \)

相关内容