如何通过文件名和部分路径搜索文件?


64

通常,我有一个文件名及其部分路径,例如“ content / docs / file.xml”。

有没有一种简单的方法来搜索该文件,而无需手动将其名称分成几部分以分别提供目录名和文件名?

如果这样做的话find,那就太好了,这样我就可以跑步了find content/docs/file.xml,但是不幸的是没有。


1
您可以尝试在开头添加*通配符。find -path *content/docs/file.xml为我工作。
鲍勃

谢谢,@鲍勃,对我来说真的很有效。顺便说一句,有趣的是,如果我在星号后添加斜杠:“找到-path * / content / docs / file.xml”,则它不起作用。还是非常感谢。

另外,@ Bob,请作为答案,我将其标记为正确。

星号后的斜杠不起作用的原因可能是因为星号应该已经转义,请参见我的答案的编辑。
鲍勃

Answers:


72

传递*通配符以表示匹配任何内容。您还需要转义*s,例如:

find . -path \*content/docs/file.xml

或将模式用引号引起来,例如:

find . -path "*content/docs/file.xml"

如手册页所述:

$查找。名称* .c -print

查找:路径必须在表达式之前

发生这种情况是因为* .c已被外壳扩展,导致find实际接收到这样的命令行:

找 。名称bigram.c code.c frcode.clocate.c -print

该命令当然是行不通的。代替这种方式,您应该将模式用引号引起来或使用通配符:

$查找。-名称\ *。c-打印


10

find也有-wholename选项 find $top_dir -wholename *string*

find /usr -wholename *in/abiw*

>/usr/bin/abiword

我不知道完整路径,只有部分路径,因此“-全名”将不起作用。

该标志具有误导性,请参见我的示例...它只是让您将字符串扩展到目录中(如果知道的话)
technosaurus 2012年

3
find . -type f | grep "content/docs/file.xml"

要不就

locate content/docs/file.xml

查找是一个有趣的选项,但是它可以搜索整个磁盘,我希望能够指定基本搜索目录或至少使用param进行指定,该搜索应从该目录进行(就像您的第一个选项一样) ,而不是根源。

1
@ user69817-相反,locate不会搜索磁盘,它会查询一个locate数据库,该数据库通常每天通过cron填充一次。
修补

1

例如,使用星号/通配符(*)在以下位置搜索文件: dir=“/apps/*/instance01/" 您可以使用find ${dir} -name “*.jks”。将所有文件放在这样的数组中:

arr=(`find ${dir} -name “*.jks"`)

如果要获取具有其他扩展名的文件,请使用“或”,如下所示:

-name "*.keystore" -o -name "*.jks" -o -name “*.p12" 因为-name仅接受单个字符串,所以请使用“或”。

最后将所有内容放入数组,如下所示:

arr=(`find ${dir} -name "*.keystore" -o -name "*.jks" -o -name "*.p12"`)

如果您有完整路径而不是部分路径,则将它们放在数组中会更加容易:

arr=(“/Users/ajay/Documents/keystore_and_p12files/"*.{keystore,p12,jks})
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.