我想要转换.mp4
个文件。
$ find . -name '*.mp4'
./01.mp4
./02.mp4
./03.mp4
我希望使用此命令输出文件copy-01.mp4
,copy-02.mp4
和copy-03.mp4
。
find . -name '*.mp4' -exec ffmpeg -i {} -c copy -aspect 16:9 copy-{} ";"
但它失败了,错误为Unable to find a suitable output format for 'copy-'
。
我认为{}
代表文件名,不是吗?
使用-exec
的{{1}}选项时,如何使用原始文件名?
find
版本是:
find
这是$ find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
Features enabled: O_NOFOLLOW(disabled) LEAF_OPTIMISATION FTS() CBO(level=0)
版本。
xargs
xargs --version
xargs (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Built using GNU gnulib version e5573b1bad88bfabcda181b9e0125fb0c52b7d3b
答案 0 :(得分:3)
正确的方法是制作一个bash脚本。问题是当前目录前缀./
如果你真的必须这样做:
find * -type f -name '*.mp4' -exec ffmpeg -i {} -c copy -aspect 16:9 copy-{} ";"
或者如果你有xargs
:
find . -name '*.mp4' | xargs -L1 basename | xargs -L1 -I{} ffmpeg -i {} -c copy -aspect 16:9 copy-{}
答案 1 :(得分:1)
要使ffmpeg访问文件,即使它们是当前目录后面的几个目录级别,您需要将整个源路径作为-i参数传递,但只需将basename作为目标文件名构建块传递。
如果您希望将它们复制到当前目录(展平),
find . -type f -name '*.mp4' -exec ffmpeg -i {} -c copy -aspect 16:9 copy-"`basename {}`" ";"
如果它们应与源相同的目录:
find . -type f -name '*.mp4' -exec ffmpeg -i {} -c copy -aspect 16:9 "`dirname {}`"/copy-"`basename {}`" ";"
答案 2 :(得分:1)
这不是一个单行班的工作。试试一个剧本:
#!/bin/bash
while IFS= read -r -d '' FILE
do
BASE=$(basename "$FILE")
COPYFILE=${FILE/$BASE/copy-$BASE}
ffmpeg -i "$FILE" -c copy -aspect 16:9 "$COPYFILE"
done < <(find . -name '*.mp4' -print0)
(当然,如果你真的想要一些分号,你也可以把它放在一行!)