通常我有一个文件名和它的部分路径,例如“content/docs/file.xml”。
有没有一种简单的方法来搜索该文件,而无需手动将其名称分成几部分来分别提供目录名和文件名?
find
如果能以这样的方式工作就太好了,这样我就可以运行了find content/docs/file.xml
,但不幸的是,它不能。
答案1
传入*
通配符来表示匹配任何事物。您还需要转义 s *
,例如:
find . -path \*content/docs/file.xml
或者将模式括在引号中,例如:
find . -path "*content/docs/file.xml"
正如手册页所描述的那样:
$ find .-name *.c-print
查找:路径必须在表达式之前
发生这种情况的原因是 *.c 已被 shell 扩展,导致 find 实际上收到如下命令行:
查找 . -name bigram.c code.c frcode.clocate.c-print
该命令当然不会起作用。您不应该这样做,而应该将模式括在引号中或转义通配符:
$ 查找。-名称 \*.c-打印
答案2
find 也有一个-path
(或等效但不太便携的-wholename
)选项find $top_dir -wholename *string*
find /usr -path *in/abiw*
>/usr/bin/abiword
答案3
find . -type f | grep "content/docs/file.xml"
要不就
locate content/docs/file.xml
答案4
例如,使用星号/通配符(*
)在某个位置搜索文件:
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})