xargs - 最后有多个命令和rm

时间:2012-07-20 09:38:47

标签: shell find xargs

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

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

4 个答案:

答案 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)

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

其次,我不太了解您要实现的目标,但是您没有将rmxargs一起使用,而只需将某些内容传递给rm。这不是rm的工作方式。

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

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