변수에서 Linux "find" 명령의 다중 이름 기능을 사용합니까?

변수에서 Linux "find" 명령의 다중 이름 기능을 사용합니까?

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_compra 와 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})

관련 정보