find
다음 명령을 사용하여 여러 파일 이름을 검색하는 방법을 새로 배웠습니다 .
find . \( -iname "*.srt" -o -iname "*.mp4" \)
그러나 어떤 경우에는 너무 많은 필터를 사용해야 하므로 간단한 명령줄이 매우 길어집니다.
find . \( -iname "*.srt" -o ......... \)
변수를 생성하고 여기에 모든 필터를 추가한 다음 find 명령에서 다시 사용할 수 있습니까? 감사해요!
답변1
GNU를 통해 구현된 find
여러 파일 이름을 검색하는 또 다른 방법이 있습니다 .
rgx='.*\.srt\|.*\.mp4'
find . -iregex "$rgx"
\|
논리적 정규식 OR(GNU 기본 정규식 유형의 emacs 유형 ) 입니다 find
. 누드는 .
모든 캐릭터를 의미합니다. 한 점은 입니다 \.
.
$rgx_compr
a 와 a를 정의한 $rgx_media
후 결합 할 수 있습니다 .
find . -iregex "$rgx_compr" -o -iregex "$rgx_media"
여기서는 괄호를 생략했습니다.
답변2
배열 변수(예: )를 지원하는 쉘을 사용하고 있으므로 bash
배열 변수를 생성하여 직접 사용할 수 있습니다.
상수 표현
find . \( -iname "*.srt" -o -iname "*.mp4" \) ...
변수 표현
opts=(-iname "*.srt" -o -iname "*.mp4")
find \( "${opts[@]}" \) ...
또는
opts=( '(' -iname "*.srt" -o -iname "*.mp4" ')' )
find "${opts[@]}" ...
배열 변수 확장 자체에는 "${opts[@]}"
하나 이상의 항목이 포함되어 있더라도 큰따옴표( )로 묶어야 합니다. 배열에 항목이 없으면 다음으로 확장됩니다.아무것도 없다(빈 문자열이 아님, ""
)
답변3
예, 가능합니다. 아래에 표시된 방법을 사용하세요. 따옴표, 와일드카드 등의 사용에 유의하세요. 그럼에도 불구하고 해결책은 다음과 같습니다 BASH
.
opt="-iname '*.srt' -o -iname '*.mp4'"
find . \( $(eval echo ${opt}) \)
단순히 명령에서 변수를 호출하는 것은 불가능하지만 ${opt}
인라인 명령을 사용하여 find
문제를 해결할 수 있습니다.eval
$(eval echo ${opt})