我正在尝试删除我之前正在处理的文件,但它不会让我,请帮忙。这是我运行的命令:
find . -type f -name '*.flac' -print0 |
xargs -0i ffmpeg -i {} -acodec libmp3lame -ab 320k "{}.mp3" |
rm -rf {}
答案 0 :(得分:2)
您正在将ffmpeg
调用的输出传递到rm
命令中。由于ffmpeg
没有产生任何有趣的输出,而rm
没有读取任何输入,因此这不起作用。
我不确定你要做什么。我想你想在处理后删除flac文件。您有几种选择:您可以先转换所有ffmpeg文件,然后将它们全部删除;或者您可以在处理完文件后将其删除。我建议后者,否则如果转换成功,将很难删除flac文件。
不是使用xargs
,而是在这里使用find … -exec
更简单。对于每个flac文件,请调用ffmpeg
,然后在ffmpeg成功时删除该文件。如果您的查找没有-delete
操作,请改用-exec rm {} \;
。使用中间shell来构造输出文件名。
find . -type f -name '*.flac' \
-exec sh -c 'ffmpeg -i "$0" -acodec libmp3lame -ab 320k "${0%.*}.mp3"' {} \; \
-delete
您可以在shell代码段中使用rm
命令。
find . -type f -name '*.flac' \
-exec sh -c 'ffmpeg -i "$0" -acodec libmp3lame -ab 320k "${0%.*}.mp3" && rm "$0"' {} \;
对于某些版本的find
,如果您希望调用输出文件foo.flac.mp3
,则可以跳过中间shell。
find . -type f -name '*.flac' \
-exec ffmpeg -i {} -acodec libmp3lame -ab 320k {}.mp3 \; \
-delete
答案 1 :(得分:2)
如果你安装了GNU Parallel,你可以这样做:
find . -type f -name '*.flac' | parallel ffmpeg -i {} -acodec libmp3lame -ab 320k {.}.mp3 '&&' rm {}
每个CPU核心运行一个ffmpeg进程。
要了解详情,请观看介绍视频:http://pi.dk/1
答案 2 :(得分:0)
命令rm
不接受来自标准输入的输入,因此您需要使用xargs
发送输入,就像您对ffmpeg
所做的那样
试试这个:
find . -type f -name '*.flac' -print0 |
xargs -0i bash -c 'ffmpeg -i {} -acodec libmp3lame -ab 320k \"{}.mp3" ; rm -rf {}'
这会将rm
添加到命令xargs
中执行,实际上是使用bash -c
创建内联shell脚本。
答案 3 :(得分:0)
首先,“它不让我”并不是描述问题的最佳方式。您应该发布错误消息或描述会发生什么。
其次,我不太了解您要实现的目标,但是您没有将rm
与xargs
一起使用,而只需将某些内容传递给rm
。这不是rm
的工作方式。
find . -type f -name '*.flac' -print0 | xargs -0i rm "{}"
例如,可能会起作用。我在这里没有使用rm -r
,因为find
无论如何都只查找文件。