将结果定位到rm


11

我尝试跑步

locate *.orig | xargs rm

但它说 No such file or directory

我已经看到了解决方法,find但是locate将返回对象的完整路径,因此应该可以

Answers:


20

如果文件名包含空格,则应使用

locate -0 $something | xargs -0 rm

locate手册页

-0--null使用ASCII NUL字符分隔输出上的条目,而不是将每个条目写在单独的行上。此选项旨在与GNU xargs(1)的--null选项实现互操作性。

要么

locate $something | while read f; do rm "$f"; done

另外,您应*.orig使用引号进行保护,以避免外壳扩展,并将其传递给未触及的位置。


“外壳扩展”是什么意思?
Solder.moth 2010年

您的第二个示例为+1。我总是使用,| while read因为我的主目录中充满了带空格的文件。
嬉皮

@ Soldier.moth:如果当前文件夹中有与pattern相对应的文件*.orig,则shell会将pattern扩展为file1.orig file2.orig ...,从而locate不会看到确切的字符串*.orig
enzotib

也可以grep找到输出,然后即可tr '\n' '\0'
Pablo Bianchi


0

该命令locate *.orig | xargs rm确实有效,但是发生的事情是在垃圾箱中locate查找*.orig文件,并在尝试删除垃圾箱中的文件时rm吐出错误No such file or directory


您应该将信息作为“注释”添加到原始答案,或者您可以编辑原始答案。这不是您自己问题的答案。
enzotib

这是我的问题的答案,我得到此错误的原因是因为locate在垃圾箱中发现了* .orig文件,而rm无法删除它们。我接受了您的答案,并对其他两个答案都投了赞成票,因为它们写得很好,可能会帮助后来的人。
士兵。蛾

0

find不会进行globbing,但是shell会进行。Shell会将* .orig扩展到它在当前目录中找到的与* .orig匹配的内容。

只需使用

locate .orig

如果能满足您的需求

locate .orig | xargs rm

或者,如enzotib所述

locate -0 .orig | xargs -0 rm

如果文件名中包含空格。


0

一个技巧:将所有路径保存在tmp文件中。然后,在其上循环:

#!/bin/bash
locate .orig /tmp/tmp.txt
while read line
do
    pth=$line
    rm "$pth" 
done < /tmp/tmp.txt

rm -rf /tmp/tmp.txt 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.