ls 명령은 bash 스크립트에 따옴표를 추가합니다.

ls 명령은 bash 스크립트에 따옴표를 추가합니다.

test.mp3 및 test.mp4 디렉토리가 포함된 폴더1이라는 폴더가 있습니다.

다음과 같은 bash 스크립트가 있습니다.

ORIGINATION_PATH=folder1
ext=mp*
files=($(ls "$ORIGINATION_PATH"/test/$ext))
for f in "${files[@]}"
do
    echo f
done

내 파일 배열에 test.mp3 및 test.mp4가 포함되기를 원하지만 스크립트가 내 ls 명령 경로를 qoutes로 래핑하기 때문에 다음 오류가 발생합니다.ls: cannot access 'folder1/test/mp*': No such file or directory

답변1

코드의 오류는 *.앞에 을 넣지 않았다는 것입니다.$ext

files=($(ls "$ORIGINATION_PATH"/test/*.$ext))

그러나 @jasonwryan이 지적했듯이ls를 구문 분석하지 마세요

ls이 경우 다음을 수행할 필요가 없습니다.

files=("$ORIGINATION_PATH"/test/*.$ext)

또는

for f in "$ORIGINATION_PATH"/test/*.$ext

와일드카드를 사용해보세요.

답변2

바꾸다:

files=($(ls "$ORIGINATION_PATH"/test/$ext))

그리고:

files=("$ORIGINATION_PATH"/test/*.$ext)

다음 문서를 고려하십시오.

$ ls folder1/test/*
folder1/test/test.mp3  folder1/test/test.mp4

이 glob은 어떤 파일과도 일치할 수 없습니다:

$ ls folder1/test/mp*
ls: cannot access 'folder1/test/mp*': No such file or directory

이는 glob test.mp3test.mp4glob이 일치하지 않기 때문입니다 mp*.

대조적으로, 이 glob은 다음 두 가지 모두와 일치합니다.

$ ls folder1/test/*.mp*
folder1/test/test.mp3  folder1/test/test.mp4

그러면 배열에서 일치하는 모든 파일이 캡처됩니다.

$ files=("$ORIGINATION_PATH"/test/*.$ext)
$ declare -p files
declare -a files='([0]="folder1/test/test.mp3" [1]="folder1/test/test.mp4")'

관련 정보