答案1
像这样的事情可以解决问题并保留完整路径、处理空间、重命名folder/movie.mov
为folder/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选项已设置,参数将在一次执行中处理尽可能多的输入项。