一般来说,经常需要找到一个文件名同时包含多个子字符串的文件。我该如何用 bash 做到这一点?
例如,名为“How to link boost with qt under linux.htm”的文件中的“boost”、“qt”和“linux”
PS 最后,我设法使用以下方法找到该文件:
find . -name *boost* | xargs find . -name *Qt*
但首先它给出了这样的抱怨:
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
find: paths must precede expression
所以,我仍在寻找一些更清晰的解决方案。
PS Stéphane Chazelas 的解决方案有所帮助。问题出在“boost”中的大字母“b”,所以我应该让这个查找不区分大小写:
find . -iname '*boost*' -iname '*qt*'
答案1
find /some/path -name '*boost*' -name '*Qt*'
或者匹配完整路径:
find /some/path -path '*boost*' -path '*Qt*'
如果您不引用这些模式,它们将首先由您的 shell 扩展。
对于不区分大小写的匹配,某些find
实现具有-iname
/ -ipath
。否则,您始终可以执行以下操作:
find /some/path -name '*[bB][oO][oO][sS][tT]*' -name '*[qQ][tT]*'
或者,假设文件路径不包含换行符:
find /some/path |
awk -F/ '{lname=tolower($NF)}; lname ~ /boost/ && lname ~ /qt/'
答案2
使用find /some/path -name "*boost*" -a -name "*qt*"
等
意思-a
是“与”寻找。