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
これは、globtest.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")'