ls 命令在 bash 脚本中添加引号

ls 命令在 bash 脚本中添加引号

我有一个名为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")'

相关内容