![查找名称同时包含给定子字符串的文件](https://linux22.com/image/66581/%E6%9F%A5%E6%89%BE%E5%90%8D%E7%A7%B0%E5%90%8C%E6%97%B6%E5%8C%85%E5%90%AB%E7%BB%99%E5%AE%9A%E5%AD%90%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%9A%84%E6%96%87%E4%BB%B6.png)
一般来说,经常需要找到一个文件名同时包含多个子字符串的文件。我该如何用 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
是“与”寻找。