이 변수를 어떻게 적절하게 정의하고 찾기 명령에 삽입합니까? [복사]

이 변수를 어떻게 적절하게 정의하고 찾기 명령에 삽입합니까? [복사]

나는 내 음악 파일을 관리하는 Bash 스크립트를 작성했는데 mscript.sh, 그 중 일부는 그러한 파일 목록을 생성했습니다.

all_exts=" -iname \"*.webm\" -o -iname \"*.mkv\" "
#all_exts=' -iname "*.webm" -o -iname "*.mp3" -o -iname "*.mp4" -o -iname "*.mkv" ' 
#The line below works fine
#find "${HOME}/pCloudDrive/SocialSciences/Arabic/al_aghani" -maxdepth 1 -type f -size +1M \( -iname "*.webm" -o -iname "*.mp3" -o -iname "*.mp4" -o -iname "*.mkv" \)|\
find "${HOME}/pCloudDrive/SocialSciences/Arabic/al_aghani" -maxdepth 1 -type f -size +1M \( "$all_exts" \)|\
awk -v FS="/" '{print $8}' > "${HOME}/pCloudDrive/SocialSciences/Arabic/al_aghani/list"
#it does not work with single quotes either

다음 출력을 얻었고 find 명령을 find: paths must precede expression: -iname "*.webm" -o -iname "*.mkv" ' 삽입하지 않고 스크립트를 실행하면 스크립트가 제대로 작동합니다. all_exts올바르게 크기를 조정하려면 어떻게 해야 합니까 all_exts? 추신: 이 스크립트는 문제를 격리하기 위한 간단한 것입니다. all_exts다양한 디렉토리에서 이 작업을 수행하는 찾기 명령이 많기 때문에 찾기 명령을 삽입해야 합니다 .

답변1

이는 변수를 참조해야 하므로 단일 문자열을 전달하기 때문 입니다 find.set -x

$ all_exts=" -iname \"*.webm\" -o -iname \"*.mkv\" "
$ set -x
$ find .  "$all_exts" > /dev/null 
+ find . ' -iname "*.webm" -o -iname "*.mkv" '

안타깝게도 인용할 수는 없습니다. 우선 왜냐하면위험할 수도 있어요따라서 이 습관을 들이지 않는 것이 가장 좋습니다. 두 번째로 표현식을 인용하지 않으면 쉘이 이를 분할하여 find별도의 인용 문자열로 전달하기 때문에 여기서는 작동하지 않기 때문입니다.

$ find .  $all_exts
+ find . -iname '"*.webm"' -o -iname '"*.mkv"'

"foo.webm"따라서 따옴표가 파일 이름의 일부인 파일을 찾습니다 . 이러한 매개변수를 변수로 명령에 전달하는 올바른 방법은 배열을 사용하고 인용된 배열을 다음에 전달하는 것입니다 find.

$ all_exts=( '-iname' '*.webm' '-o' '-iname' '*.mkv' )
$ find . \( "${all_exts[@]}" \)
+ find . '(' -iname '*.webm' -o -iname '*.mkv' ')'
./foo.webm

관련 정보