需要有关 ls 和转义字符的帮助

需要有关 ls 和转义字符的帮助

我正在尝试创建一个 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只是在每行末尾添加一个反斜杠。我需要帮助让看起来$inputName of First File.mkv等等。

答案1

正如评论中指出的,引用您的参数扩展和不要循环ls输出。如果不带引号的文件名包含IFSshell 变量中的任何字符,则它们可能会被分割。

以下代码可以解决您的问题:

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内置命令

相关内容