【问题标题】:Bash script that lists files in a directory doesn't work列出目录中文件的 Bash 脚本不起作用
【发布时间】:2019-01-04 11:18:57
【问题描述】:

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

#!/bin/bash

touch .lista
ls -1 "$1" | grep -i .MOV > .lista
list= `pwd`/.lista
cd "$1"
while read -r line;
    do filename=${line%????}
    ffmpeg -i "$line" -vcodec copy -acodec copy "$filename.mp4"; done < $list
rm .lista

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

【问题讨论】:

  • 我的回答或其他人是否解决了您的问题?如果是这样,请考虑接受它作为您的答案 - 通过单击计票旁边的空心对勾/复选标记。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢。 meta.stackexchange.com/questions/5234/…

标签: bash shell ffmpeg mp4 mov


【解决方案1】:

像这样使用 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 为您处理所有循环、所有引用和更改扩展名是多么容易。

【讨论】:

  • 我很快就会尝试这种方式。不幸的是我的路由器坏了,因为昨天发生了闪电风暴,所以我现在不能下载 GNU Parallel。
  • 酷 - 我相信你会喜欢它的易用性,尤其是性能,尤其是在这个 CPU 几乎没有变得更快但内核越来越多的世界中,因此并行解决方案越来越多适合充分利用它们。
【解决方案2】:

您的代码对我有用。我看不到任何错误。但我可以建议你一个更好的方法。不要使用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"

【讨论】:

  • 最好使用 PesaThe 的答案中的 glob,因为如果文件名包含空格,单词可能会中断
  • 这就是为什么我使用“read -r line”...名称中的空格给我带来了很多问题。无论如何感谢两个提示
【解决方案3】:

最好简单地使用 glob 循环:

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

Why you shouldn't parse the output of ls.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-13
    • 2014-04-27
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多