安全地搜索和删除文件

安全地搜索和删除文件

我想搜索nohup.out我已安装的文件系统中的所有内容,然后删除它们。

  1. 有一些目录和文件的文件名包含空格,所以我想到了xargs -0.

  2. 为了安全起见,我想以交互方式删除它们,即询问我是否真的要删除它们。所以我想到了rm -i并且xargs -p

  3. 我还想单独删除每个找到的文件,所以我想到了xargs -n 1.

但下面的命令并没有按照我希望的方式工作。

locate  -i nohup.out | xargs -0 -n 1 -p rm -i

它不会提示删除每个文件并请求我的许可。

我想知道为什么以及什么命令可以像我希望的那样工作?

顺便说一句,我的 xargs 版本是 xargs (GNU findutils) 4.4.2。会是这个原因吗?

答案1

使用findlocate

find . -name "nohup.out" | xargs -n 1 -p rm

当您添加时,它充当提示rm -i的输入-p

find也可以用这个方法

find . -name "nohup.out" -exec rm -i {} \;

答案2

但下面的命令并没有按照我希望的方式工作。

locate -i nohup.out | xargs -0 -n 1 -p rm -i

当然,如果您正在使用,xargs -0那么您必须将其与 相匹配locate -0

它不会提示删除每个文件并请求我的许可。我想知道为什么

xargs/dev/tty应该在提示您时读取输入。它以这种方式工作,因此使用 的xargsstdin 读取参数locate和读取选项的响应之间不会发生冲突-p

但是,您正在使用xargs来运行rm -i.该rm -i命令还想读取您的输入,它将从标准输入中读取。因此,它会消耗掉部分xargs输入,并且事情不会按您的预期进行。

什么命令可以如我希望的那样工作?

如果您使用的是 Bash,这是一种选择:

xargs -a <(locate -0 -i nohup.out) -0 -n 1 -p rm -i

但是,您也可以执行 find 中的所有操作:

find / -depth -name nohup.out -ok rm -i '{}' ';'

改变 ';'到“+”可一次删除多个文件。此要求以及解决此问题的各种方法在中进行了解释findutils 的 Texinfo 手册

答案3

如果您想要交互行为并使用 xargs 进行提示,您可能需要这样做:

locate  -i nohup.out | xargs -d '\n' -L1 -p rm

答案4

POSIXly:

find /path/to/mounted_fs -xdev -type f -name nohup.out -exec rm -i {} +

-xdev仅限find于在已安装的文件系统中搜索。-exec rm -i {} +像您使用的那样使用xargs,但文件名中的特殊字符没有问题。


你的命令的问题:

locate -i nohup.out | xargs -0 -n 1 -p rm -i

您告诉xargs使用\0作为输入分隔符,但locate输出没有使用\0but \n,因此xargs会将locate输出视为一个大字符串。

相关内容