Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列出目录中文件的Bash脚本不会';行不通_Bash_Shell_Ffmpeg_Mp4_Mov - Fatal编程技术网

列出目录中文件的Bash脚本不会';行不通

列出目录中文件的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

我制作了一个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
#/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速度几乎没有提高,但内核越来越多的世界里,因此,并行解决方案越来越适合于充分利用它们。我的答案或其他答案解决了您的问题吗?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢我的答案或其他答案解决了你的问题吗?如果是这样,请考虑接受它作为您的答案-点击空心蜱/支票旁边的选票计数。如果没有,请说出什么不起作用,以便我或其他人可以进一步帮助您。谢谢