我正在尝试删除我之前正在处理的文件,但它不允许我,请帮助。这是我运行的命令:
find . -type f -name '*.flac' -print0 |
xargs -0i ffmpeg -i {} -acodec libmp3lame -ab 320k "{}.mp3" |
rm -rf {}
如果您安装了 GNU Parallel,您可以执行以下操作:
find . -type f -name '*.flac' | parallel ffmpeg -i {} -acodec libmp3lame -ab 320k {.}.mp3 '&&' rm {}
它将为每个 CPU 核心运行一个 ffmpeg 进程。
要了解更多信息,请观看介绍视频: http: //pi.dk/1
您正在将ffmpeg
调用的输出通过管道传输到rm
命令中。由于ffmpeg
不产生任何有趣的输出并且rm
不读取任何输入,因此这不会做任何事情。
我不确定你想做什么。我认为您想在处理后删除 flac 文件。您有几种选择:您可以先转换所有 ffmpeg 文件,然后将它们全部删除;或者您可以在处理完每个文件后将其删除。我建议后者,否则如果转换成功,则很难仅删除 flac 文件。
而不是 use xargs
,在这里使用起来更简单find … -exec
。对于每个 flac 文件,调用ffmpeg
,如果 ffmpeg 成功,则删除该文件。如果您的 find 没有该-delete
操作,请-exec rm {} \;
改用。使用中间外壳来构造输出文件名。
find . -type f -name '*.flac' \
-exec sh -c 'ffmpeg -i "$0" -acodec libmp3lame -ab 320k "${0%.*}.mp3"' {} \; \
-delete
您可以改用rm
shell 片段中的命令。
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
该命令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
.
首先,“它不让我”不是描述问题的最佳方式。您应该发布错误消息或描述发生的情况。
其次,我不太明白你想要达到的目标,但你没有使用rm
with xargs
,你只是通过管道传递一些东西到rm
. 这不是如何rm
工作的。
find . -type f -name '*.flac' -print0 | xargs -0i rm "{}"
例如,可能会起作用。我没有rm -r
在这里使用,因为find
无论如何只查找文件。