如何使用 xargs 同时使用两个参数?

如何使用 xargs 同时使用两个参数?

我需要转换视频,但我不知道它们在哪里,所以我需要find它们。我如何将结果和输出文件名提供给FFmpegxargs

我已经发现我可以使用此命令构造这两个参数:

find . -iname "*.mov" -printf "%p %f\n"

我在手册中找不到任何相关内容xargs。我想要这样的东西:

find . -iname "*.mov" -printf "%p %f\n" | xargs ffmpeg -i {param1} -f flv {param2}

我怎样才能做到这一点?

答案1

像这样的事情可以解决问题并保留完整路径、处理空间、重命名folder/movie.movfolder/movie.flv等。

find . -name "*.mov" | while read movie;do
  ffmpeg -i "$movie" -f flv "${movie%.mov}.flv"
done

如果我误解了你的意思,你想要当前目录中的所有 .flv 电影,请使用这个:

find . -name "*.mov" | while read movie;do
  ffmpeg -i "$movie" -f flv "$(basename "${movie%.mov}.flv")"
done

答案2

xargs人们将其与 find 结合使用的原因是,无论xargs启动哪个程序,多个文件名都会被传递给同一个程序调用。例如,如果find返回文件酒吧, 和巴兹,以下将mv仅运行一次:

find sourceDir [...] -print0 | xargs -0 mv -t destDir

实际上,它的调用方式mv如下:

mv -t destDir foo bar baz

如果您不需要或不想要这种行为(我假设这里就是这种情况),您可以简单地find使用-exec


在这种情况下,一个简单的解决方案就是编写一个简短的 shell 脚本,如下所示:

#!/usr/bin/env bash
[[ -f "$1" ]] || { echo "$1 not found" ; exit 1 ; }
P="$1"
F="$( basename $P )"
ffmpeg -i "$P" -f flv "$F"

另存为myffmpeg.sh并运行chmod +x myffmpeg.sh。然后运行以下命令:

find . -iname "*.mov" -exec /path/to/myffmpeg.sh {} \;

这将对找到的每个文件调用一次 shell 脚本。shell 脚本依次从完整路径中提取文件名,并ffmpeg使用适当的参数进行调用。

答案3

您必须像上面所有的答案那样去做,但 xargs 的确切用法将是这样的:

echo argument1 argument2 argument3 | xargs -l bash -c 'echo this is first:$0 second:$1 third:$2' | xargs

因此,对于你来说,情况将是:

find . -iname "*.mov" -printf "%p %f\n" | xargs -l bash -c 'echo ffmpeg -i $0 -f flv $1' | xargs

PS:对于那些正在寻找xargs一个xargs命令中多个参数的准确答案的人来说,这回答了有关 xargs 的问题。

答案4

为什么不简单地移动ffmpeg以适应结果的格式寻找命令?

find . -iname "*.mov" -printf "%p %f\n" | xargs -r -n2 ffmpeg -f flv -i

注意添加-r选择参数以防止其运行ffmpeg如果不.mov找到文件。

我已经添加了-n2选择参数限制物品数量参数每次最多处理两个。在这种情况下,项目是文件路径和文件名。如果没有-n选项已设置,参数将在一次执行中处理尽可能多的输入项。

相关内容