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

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

関連情報