如何在命令行中查找符合某一模式的文件,并且这些文件位于一个符合另一模式的目录中?

14

假设我想在/Path中找到所有名称为file_name*的文件。很简单:

$ find /Path -name "file_name*"
/Path/foo1/file_name1.txt
/Path/foo2/file_name2.txt
/Path/bar3/file_name3.txt
/Path/bar4/file_name4.txt
如果我只想搜索像bar这样的子目录怎么办?
我可以使用管道将结果连接起来,但这种方法效率很低。
$ find /Path -name "file_name*" | grep "bar"
/Path/bar3/file_name3.txt
/Path/bar4/file_name4.txt

有没有办法在“find”命令中获取它们并跳过不匹配“bar”的目录?

注意:如果我特定搜索/Path/bar3,结果会立即返回。 但是,如果我只搜索/Path,然后使用grep搜索bar,则需要30-60秒。这就是为什么管道到grep不可接受的原因。

2个回答

16

您可以在 -name 参数中使用通配符,但也可以在路径参数中使用它。

find /Path/bar* -name "file_name*"

我创建了以下的测试目录:

./Path
|-- bar
    `-- file_name123.txt
|-- bar1
    `-- file_name234.txt
|-- bar2
    `-- file_name345.txt
|-- foo
    `-- file_name456.txt

以上命令会返回:

Path/bar/file_name123.txt
Path/bar1/file_name234.txt
Path/bar2/file_name345.txt

7
您可以使用-path标志,如下所示:
find /Path -path "/Path/bar*" -name "file_name*"

这样可以在没有简单通配符的情况下执行多个路径,例如:

find /PATH \( -path "/Path/bar*" -o -path "/Path/foo* \) -name "file_name*"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接