2

我正在尝试删除我之前正在处理的文件,但它不允许我,请帮助。这是我运行的命令:

find . -type f -name '*.flac' -print0 |
  xargs -0i ffmpeg -i {} -acodec libmp3lame -ab 320k "{}.mp3" |
  rm -rf {}
4

4 回答 4

3

如果您安装了 GNU Parallel,您可以执行以下操作:

find . -type f -name '*.flac' | parallel ffmpeg -i {} -acodec libmp3lame -ab 320k {.}.mp3 '&&' rm {}

它将为每个 CPU 核心运行一个 ffmpeg 进程。

要了解更多信息,请观看介绍视频: http: //pi.dk/1

于 2012-07-26T00:46:27.190 回答
2

您正在将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

您可以改用rmshell 片段中的命令。

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
于 2012-07-20T10:01:33.360 回答
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.

于 2012-07-20T09:58:18.287 回答
0

首先,“它不让我”不是描述问题的最佳方式。您应该发布错误消息或描述发生的情况。

其次,我不太明白你想要达到的目标,但你没有使用rmwith xargs,你只是通过管道传递一些东西到rm. 这不是如何rm工作的。

find . -type f -name '*.flac' -print0 | xargs -0i rm "{}"

例如,可能会起作用。我没有rm -r在这里使用,因为find无论如何只查找文件。

于 2012-07-20T09:59:00.803 回答