Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.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
Linux 将命令的输出传递给rm-r命令_Linux_Shell - Fatal编程技术网

Linux 将命令的输出传递给rm-r命令

Linux 将命令的输出传递给rm-r命令,linux,shell,Linux,Shell,当目录数超过10时,我想删除目录中的旧目录。 当我运行命令时 sudo rm -r `ls -1t /ebs/lucene_indexes/ | tail -n +10` 我遇到以下错误: rm: cannot remove â1432120954â: No such file or directory rm: cannot remove â1432120945â: No such file or directory rm: cannot remove â1432120937â: No suc

当目录数超过10时,我想删除目录中的旧目录。 当我运行命令时

sudo rm -r `ls -1t /ebs/lucene_indexes/ | tail -n +10`
我遇到以下错误:

rm: cannot remove â1432120954â: No such file or directory
rm: cannot remove â1432120945â: No such file or directory
rm: cannot remove â1432120937â: No such file or directory
rm: cannot remove â1432120927â: No such file or directory
rm: cannot remove â1432120917â: No such file or directory
rm: cannot remove â1432118817â: No such file or directory
rm: cannot remove â1432118631â: No such file or directory
rm: cannot remove â1432118349â: No such file or directory
但当我执行时:

ls -1t /ebs/lucene_indexes/ | tail -n +10
我得到以下输出:

1432120954
1432120945
1432120937
1432120927
1432120917
1432118817
1432118631
1432118349
由于某种原因,当我执行第一个命令时,目录名被附加在一个特殊字符的前面。所以它失败了。为什么会这样?这里出了什么问题?

xargs是你的朋友,例如:

ls -1t /ebs/lucene_indexes/ | tail -n +10 | xargs rm -r

干杯,

执行ls时,我怀疑您不在/ebs/lucene_index/目录中,这意味着列出的目录不直接在您当前的工作目录下。我会将cd刻录到目录中,然后从..执行您的ls。。我不记得有什么简单的方法可以按时间排序,我也不记得

(cd /ebs/lucene_indexes/; sudo rm -r $(ls -t | tail -n +10 ))
给你想要的?请注意,周围的括号在子shell中执行cd,因此现有cwd不会更改。此外,-1在管道中是不必要的。

包含关键指针:rm命令不一定在/ebs/lucene_index/中运行,因此,当从其他目录运行时,它将以ls-1t生成的仅文件名输出失败

mpez0的答案解决了这个问题,但是,就像OP的命令一样,它使用带有嵌入空格的文件名来中断;以下是正确处理带有嵌入空格的文件名的版本:

它使用xargs从ls读取输出行,并为每个输出行调用rm-I,每行作为一个命令行参数;这种与POSIX兼容的xargs使用的缺点是您会得到多个rm调用

使用GNU xargs使用-0选项解析NUL分隔的输入的能力,您可以通过让xargs传递命令行上所能容纳的尽可能多的参数来提高命令的效率,这通常只会导致一次rm调用:

tr'\n'\0'将换行符替换为NULs 0x0,以准备由xargs-0进行处理。 xargs-0rm-r-将所有NUL分隔的令牌作为命令行参数从stdin传递给rm-r,通常只导致一次对rm的调用 请注意,使用NUL分隔输入可以正确地保留带有嵌入空格甚至制表符的路径作为不同的参数。如果没有tr'\n'\0'/xargs-0组合,仅使用xargs rm-r,则带有嵌入空格的路径将被错误地分解为多个参数,从而导致rm失败。 注意ls是如何配置的-颜色行为,如注释中所述,用\ls绕过名为ls的潜在别名也是值得的,但这将我们带到一个更大的点:它是,因为通常有更好、更可靠的替代方案可用

不幸的是,在这种情况下避免使用ls会使命令变得非常复杂。请继续阅读,了解基于查找的解决方案

注意:归根结底,这种基于查找的解决方案与基于ls的解决方案相比没有太多优势,因为它也不能处理带有嵌入换行符的文件名;但是,它将有助于处理包含外来字符的文件名,例如制表符\t,ls通常表示为?在输出中

find /ebs/lucene_indexes -mindepth 1 -maxdepth 1 -printf '%T@\t%p\n' | 
 sort -n | head -10 | cut -f2- | tr '\n' '\0' | sudo xargs -0 rm -r --
注意:在下面的解释中,“文件”指的是文件和目录

find/ebs/lucene_index-mindepth 1-maxdepth 1与ls/ebs/lucene_index等效,只是它返回路径,而不仅仅是文件名,并且输出不会被排序。 -printf'%T@\T%p\n'输出每个文件在纪元时间%T@中的最后修改日期,后跟一个选项卡,后跟文件的完整路径%p。 sort-n然后对输出进行排序,以便首先列出最旧的文件,head-10因此输出10个最旧的文件。 cut-f2-从输出中删除日期列,只保留完整路径。 tr'\n'\0'和xargs-0 rm-r-如上所述工作。
问题是否可能是ls的输出包含颜色输出,这在一定程度上污染了传递给rm的参数。试试ls-color=neverGood point,@beny23!您还可以通过说\ls来防止任何别名影响ls。为了回答问题的人以及未来的读者的利益:如果答案解决了您的问题,请单击旁边的大复选标记来接受它;如果您发现答案有帮助,请单击向上箭头图标向上投票,您可以同时进行这两项操作。看见如果您的问题还没有完全回答,请提供反馈。您能告诉我如何使用ssh++进行诊断,但值得注意的是,这将破坏带有嵌入空格的文件名,就像OP自己的命令一样。@AshwinG ssh cd/ebs/lucene@mklement0您当然是对的,但处理所有不寻常的文件名案例以获得类似的示例建议往往会模糊问题答案的要点。@mklement0再次,您是对的;我通常会对处理不寻常的文件名发表评论。我已经纠正了我未能对纠正意见进行投票的错误。谢谢,:指出xargs是这项工作的正确工具是个好主意,但请注意 至少,您的重新格式化本质上与OP自己的命令相同,这意味着:a如果当前目录不是/ebs/lucene_index/,它将从根本上失败,b它将与带有嵌入空格的文件名中断。
(cd /ebs/lucene_indexes/ && \ls -t | tail -10 | tr '\n' '\0' | sudo xargs -0 rm -r --)
find /ebs/lucene_indexes -mindepth 1 -maxdepth 1 -printf '%T@\t%p\n' | 
 sort -n | head -10 | cut -f2- | tr '\n' '\0' | sudo xargs -0 rm -r --