【发布时间】:2012-07-19 13:50:58
【问题描述】:
我正在尝试删除我之前正在处理的文件,但它不允许我这样做,请帮助。这是我运行的命令:
find . -type f -name '*.flac' -print0 |
xargs -0i ffmpeg -i {} -acodec libmp3lame -ab 320k "{}.mp3" |
rm -rf {}
【问题讨论】:
我正在尝试删除我之前正在处理的文件,但它不允许我这样做,请帮助。这是我运行的命令:
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
【讨论】:
upload 是您用来上传的程序):find . -type f -name '*.flac' | parallel ffmpeg -i {} -sameq {.}.mp4 '&&' upload {.}.mp4 '&&' rm {}
您正在将ffmpeg 调用的输出通过管道传输到rm 命令中。由于ffmpeg 不会产生任何有趣的输出,而rm 不会读取任何输入,因此它不会执行任何操作。
我不确定你想做什么。我认为您想在处理后删除 flac 文件。您有几种选择:您可以先转换所有 ffmpeg 文件,然后将它们全部删除;或者您可以在处理完每个文件后将其删除。我建议后者,否则如果转换成功的话,很难只删除flac文件。
这里使用find … -exec 比使用xargs 更简单。对于每个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 sn-p 中使用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
【讨论】:
命令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 脚本。
【讨论】:
首先,“它不让我”不是描述问题的最佳方式。您应该发布错误消息或描述发生的情况。
其次,我不太明白您想要实现的目标,但您没有将rm 与xargs 一起使用,您只需将某些内容通过管道传输到rm。 rm 不是这样工作的。
find . -type f -name '*.flac' -print0 | xargs -0i rm "{}"
例如,可能会起作用。我没有在这里使用rm -r,因为find 无论如何只会查找文件。
【讨论】: