我正在尝试创建一个 bash 脚本来对目录中文件名包含空格的每个文件运行 ffmpeg 命令。这是我开始制作一个可以正常工作的单个文件的脚本。我用来tab
填充文件名参数,其中包括所有空格的转义字符:
#!/bin/bash
input="./"$1
output="/xfer/transfer/temp/"$1
ffmpeg -i "${input}" -c:v copy -c:a libfdk_aac -b:a 160k "${output}"
下一步是对目录中的所有文件执行 ffmpeg 命令。假设目录如下所示,命令如下ls
:
'Name of First File.mkv'
'Name of Second File.mkv'
这是我的测试代码:
#!/bin/bash
files=$(ls *)
for input in ${files}
do
echo $input
done
我的问题是输出如下所示:
Name
of
First
File.mkv
Name
Of
Second
File.mkv
在 ls 命令中添加 a-b
只是在每行末尾添加一个反斜杠。我需要帮助让看起来$input
像Name of First File.mkv
等等。
答案1
正如评论中指出的,引用您的参数扩展和不要循环ls
输出。如果不带引号的文件名包含IFS
shell 变量中的任何字符,则它们可能会被分割。
以下代码可以解决您的问题:
for file in *; do
ffmpeg -i "${file}" -c:v copy -c:a libfdk_aac -b:a 160k "/xfer/transfer/temp/${file}"
done
替换循环中的模式时要小心;它可以扩展为带有斜杠的路径名列表,该列表将与字符串连接/xfer/transfer/temp
。为了防止这种情况,您可以执行以下操作:
for file in otherdirectory/*; do
ffmpeg -i "${file}" -c:v copy -c:a libfdk_aac -b:a 160k "/xfer/transfer/temp/$(basename "${file}")"
done
如果您需要更深地递归目录,请globstar
使用以下命令设置选项shopt
内置命令。