将文件传递给命令时如何处理名称中包含空格的文件
how to deal with files that have spaces in their names when passing it to a command
我是 bash 的新手,正在编写一个 shell 脚本来将一些元数据添加到音乐文件中,文件名 space 中有一些
FFMPEG_TARGET_COMMAND="\"$INPUT_DIRECTORY\" $SOME_METADATA_ARG \"$OUTPUT_DIRECTORY\""
echo $FFMPEG_TARGET_COMMAND
> "/user/musicEx/Dream In Drive.mp3" \
-metadata album="soundtrack" \
-codec copy "/user/output/Dream In Drive.mp3"
ffmpeg -i $FFMPEG_TARGET_COMMAND
我得到了“/user/musicEx/Dream:没有那个文件或目录
但是如果我通过输入
在 shell 中执行ffmpeg -i "/user/musicEx/Dream In Drive.mp3" \
-metadata album="soundtrack" \
-codec copy "/user/output/Dream In Drive.mp3"
这会起作用
我不知道为什么。我已经转义了 $FFMPEG_TARGET_COMMAND 中的引号。我试图转义 space 字符,但它也没有用。
另外,我尝试将它们全部放入一个变量中:
COMMAND="ffmpeg -i \"/user/musicEx/SCARLET NEXUS.mp3\" -codec copy \"/user/output/SCARLET NEXUS.mp3\""
我按$COMMAND
那么,在脚本中,如何处理名称中包含[=36=]的文件?
使用 bash 个数组。
SOME_METADATA_ARGS=( -metadata album="soundtrack" )
ffmpeg_args=( "$INPUT_DIRECTORY" "${SOME_METADATA_ARGS[@]}" -codec copy "$OUTPUT_DIRECTORY" )
ffmpeg -i "${ffmpeg_args[@]}"
how to deal with files that have spaces in their names when passing it to a command
适当引用变量展开,禁止分词展开。使用 shellcheck 检查你的脚本。这不是您放入变量中的内容,而是您使用 变量的方式。阅读 https://mywiki.wooledge.org/BashFAQ/020 和 https://mywiki.wooledge.org/BashFAQ/050.
没有理由SHOUT_THAT_MUCH。更喜欢对局部 non-exported 变量使用小写变量。