我有一个名为folder1 的文件夹,其中包含目录test.mp3 和test.mp4。
我有一个看起来像这样的 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
这是因为既不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")'