Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell xargs-结尾处有多个命令和rm_Shell_Find_Xargs - Fatal编程技术网

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{}