列出目录中文件的Bash脚本不起作用

时间:2018-07-27 10:34:22

标签: bash shell ffmpeg mp4 mov

我制作了一个bash脚本,因为我需要将目录中的许多文件从.MOV转换为.mp4格式。 我为此创建了此脚本:

E

该脚本应该将我每个.MOV文件转换为$ 1指示的目录,但是它不起作用,它仅转换我一个文件,然后终止。我不明白为什么。怎么了?

3 个答案:

答案 0 :(得分:2)

最好使用glob循环:

for file in "$1"/*.MOV; do
    ffmpeg -i "$file" ... "${file%.*}.mp4" 
done 

Why you shouldn't parse the output of ls.

答案 1 :(得分:2)

使用 GNU Parallel 并行地快速,简洁地完成所有操作,如下所示:

parallel --dry-run ffmpeg -i {} -vcodec copy -acodec copy {.}.mp4 ::: movies/*MOV

示例输出

ffmpeg -i movies/a.MOV -vcodec copy -acodec copy movies/a.mp4
ffmpeg -i movies/b.MOV -vcodec copy -acodec copy movies/b.mp4

如果看起来不错,请重做一次,但不要使用--dry-run

请注意 GNU Parallel 为您轻松处理所有循环,所有引用和更改扩展名。

答案 2 :(得分:1)

您的代码对我有用。我看不到任何错误。但我可以建议您采用更好的方法。不要使用ls来获取文件名,这不是一个好主意。另外,您可以避免更改目录。

#!/bin/bash

for line in $(find "$1" -maxdepth 1 -type f -iname "*.mov")
do
    ffmpeg -i "$line" -vcodec copy -acodec copy "${line%????}.mp4"
done

您无需先触摸文件即可。无论如何,您根本不需要文件,可以使用for循环来遍历find直接返回的文件。使用find,我已经选择了指定文件夹中所有具有预期扩展名的文件。

在这里,我添加了一个单线,应该避免空格问题:

find "$1" -maxdepth 1 -type f -iname "*.mov" -print0 | xargs -0 -n 1 -I{} bash -c "F={}; ffmpeg -i \"\$F\" -vcodec copy -acodec copy \"\${F%.*}\".mp4"