列出目录中文件的Bash脚本不会';行不通
我制作了一个bash脚本,因为我需要将目录中的许多文件从.MOV格式转换为.mp4格式。 我创建此脚本的目的是:列出目录中文件的Bash脚本不会';行不通,bash,shell,ffmpeg,mp4,mov,Bash,Shell,Ffmpeg,Mp4,Mov,我制作了一个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 "$fil
#!/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
#/bin/bash
触摸,莉斯塔
ls-1“$1”| grep-i.MOV>.lista
list=`pwd`/.lista
cd“$1”
而read-r行;
do filename=${line%??}
ffmpeg-i“$line”-vcodec副本-acodec副本“$filename.mp4”;完成<$list
利斯塔rm
这个脚本应该将每个.MOV文件转换为$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"
你的代码对我有用。我看不出有任何错误。但我可以建议你一个更好的方法。不要使用
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"
最好简单地使用globs循环:
for file in "$1"/*.MOV; do
ffmpeg -i "$file" ... "${file%.*}.mp4"
done
最好简单地使用globs循环:
for file in "$1"/*.MOV; do
ffmpeg -i "$file" ... "${file%.*}.mp4"
done
与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
如果这看起来不错,请再次进行,但不要进行--试运行
请注意,GNU Parallel为您处理所有循环、所有引用和更改扩展名是多么容易。将它们与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
如果这看起来不错,请再次进行,但不要进行--试运行
请注意,GNU Parallel是多么容易地为您处理所有循环、所有引用和更改扩展名。最好像PesaThe的回答那样使用globs,因为如果文件名包含空格,单词可能会断开这就是为什么我使用“read-r line”…名称中的空格给了我很多问题。无论如何,多亏了这两个原因,在佩萨西的回答中使用globs会更好,因为如果文件名包含空格,单词可能会断开。这就是为什么我使用“read-r行”…名称中的空格给了我很多问题。不管怎样,多亏了这两个人,我很快就会尝试这种方法。不幸的是,我的路由器坏了,因为昨天发生了闪电风暴,所以我现在无法下载GNU并行。酷-我相信你会喜欢它的易用性,特别是它的性能,特别是在这个CPU速度几乎没有提高,但内核越来越多的世界里,因此,并行解决方案越来越适合于充分利用它们。我很快就会尝试这种方法。不幸的是,我的路由器坏了,因为昨天发生了闪电风暴,所以我现在无法下载GNU并行。酷-我相信你会喜欢它的易用性,特别是它的性能,特别是在这个CPU速度几乎没有提高,但内核越来越多的世界里,因此,并行解决方案越来越适合于充分利用它们。我的答案或其他答案解决了您的问题吗?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢我的答案或其他答案解决了你的问题吗?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢