
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.mp3
과 test.mp4
glob이 일치하지 않기 때문입니다 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")'