Shell xargs-结尾处有多个命令和rm
我正在尝试删除我以前处理的文件,但它不允许我删除,请帮助。以下是我运行的命令:Shell xargs-结尾处有多个命令和rm,shell,find,xargs,Shell,Find,Xargs,我正在尝试删除我以前处理的文件,但它不允许我删除,请帮助。以下是我运行的命令: find . -type f -name '*.flac' -print0 | xargs -0i ffmpeg -i {} -acodec libmp3lame -ab 320k "{}.mp3" | rm -rf {} 命令rm不从标准输入中获取输入,因此您需要使用xargs发送输入,就像您对ffmpeg所做的那样 试试这个: find . -type f -name '*.flac' -print0
find . -type f -name '*.flac' -print0 |
xargs -0i ffmpeg -i {} -acodec libmp3lame -ab 320k "{}.mp3" |
rm -rf {}
命令
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
无论如何只查找文件。您正在将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
如果已安装GNU并行,则可以执行以下操作:
find . -type f -name '*.flac' | parallel ffmpeg -i {} -acodec libmp3lame -ab 320k {.}.mp3 '&&' rm {}
它将为每个CPU核心运行一个ffmpeg进程
要了解更多信息,请观看简介视频:第二个选项看起来是最好、最简单的选项,完全按照问题的要求进行操作,不使用管道。非常优雅的解决方案。嗨,我想我可能得试试这个。我有一个3.2GHz的四核Xeon E3-1230 CPU,8200的Passmark CPU,32GB ram-如果不过载,我不能执行超过4个ffmpeg命令。。。不知道为什么。。。如果你告诉我,我可以让每个FFMPEG会话运行在它自己的CPU核心上,我可能不得不考虑这个问题。GNU Parallel最有可能检测到8个核心(因为超线程),并并行启动8个ffmpeg作业。GNU并行并不保证进程将在其自己的核心上运行。它只是启动与内核数量对应的作业数量。您的O/S会处理其余部分。我调整了它,并像这样运行,效果非常好!:找到-输入f-name'*'| parallel ffmpeg-i{}-sameq{.}.mp4'&&&'rm{},如果我正确理解的话。这是否意味着我可以使用parallel执行a |并运行另一个命令?例如,如果我想将最近编码的文件上载到ftp服务器,我将如何使用一行代码执行此操作?类似于(其中upload
是用于上载的程序):find-键入f-name'*.flac'| parallel ffmpeg-i{}-sameq{}.mp4'&&“upload{}.mp4'&&“rm{}