如何在命令行中“查找”与另一个模式匹配的目录中的文件匹配模式?
How can I `find` files matching pattern within a directory matching another pattern from the command line?
假设我想在 /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
是不可接受的。
您在 -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
您可以像
一样使用-path
标志
find /Path -path "/Path/bar*" -name "file_name*"
这让您可以在没有像
这样简单的通配符的情况下执行多个路径
find /PATH \( -path "/Path/bar*" -o -path "/Path/foo* \) -name "file_name*"
假设我想在 /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
是不可接受的。
您在 -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
您可以像
一样使用-path
标志
find /Path -path "/Path/bar*" -name "file_name*"
这让您可以在没有像
这样简单的通配符的情况下执行多个路径find /PATH \( -path "/Path/bar*" -o -path "/Path/foo* \) -name "file_name*"