我想搜索nohup.out
我已安装的文件系统中的所有内容,然后删除它们。
有一些目录和文件的文件名包含空格,所以我想到了
xargs -0
.为了安全起见,我想以交互方式删除它们,即询问我是否真的要删除它们。所以我想到了
rm -i
并且xargs -p
我还想单独删除每个找到的文件,所以我想到了
xargs -n 1
.
但下面的命令并没有按照我希望的方式工作。
locate -i nohup.out | xargs -0 -n 1 -p rm -i
它不会提示删除每个文件并请求我的许可。
我想知道为什么以及什么命令可以像我希望的那样工作?
顺便说一句,我的 xargs 版本是 xargs (GNU findutils) 4.4.2。会是这个原因吗?
答案1
使用find
不locate
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
应该在提示您时读取输入。它以这种方式工作,因此使用 的xargs
stdin 读取参数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
输出没有使用\0
but \n
,因此xargs
会将locate
输出视为一个大字符串。