일반적으로 파일 이름에 여러 하위 문자열이 동시에 포함된 파일을 찾아야 하는 경우가 많습니다. Bash로 이 작업을 어떻게 수행할 수 있나요?
예를 들어 "linux.htm에서 Boost를 qt와 연결하는 방법"이라는 파일의 "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*'
이러한 패턴을 인용하지 않으면 먼저 쉘에 의해 확장됩니다.
일부 구현에는 대소문자를 구분하지 않는 일치를 위한 / 가 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
있습니다.