使用find和xargs以交互方式删除文件

时间:2013-08-18 19:24:39

标签: shell xargs rm

我正在尝试将一些文件从find命令传递到交互式删除命令,这样我就可以仔细检查我要删除的文件,但是我遇到了一些麻烦。

find -name '#*#' -print0 | xargs -0 rm -i

我认为上述方法可行,但我只是得到一串"rm: remove regular file ./some/path/#someFile.js#? rm: remove regular file ./another/path/#anotherFile#?..."

有人可以向我解释究竟发生了什么,以及我能做些什么才能得到我想要的结果?感谢。

2 个答案:

答案 0 :(得分:12)

您可以使用exec选项find来执行此操作。使用命令

find . -name '#*#' -exec rm -i {} \;

xargs将无效(除非您使用-o-p等选项),因为它使用stdin来构建命令。由于stdin已被使用,因此您无法使用rm输入查询回复。

答案 1 :(得分:6)

  

有人可以向我解释到底发生了什么,

正如man page for xargs所说(在-a选项下):"如果使用此选项,stdin在运行命令时保持不变。 否则, stdin将从/ dev / null 重定向。"

由于您未使用-a选项,rm -i正在运行的每个xargs命令都会从/ dev / null获取其stdin(即没有可用的输入)。当rm询问是否删除特定文件时,答案是有效的" no"因为/ dev / null没有回复。 rm在其输入上收到EOF,因此它不会删除该文件,然后继续下一个文件。

  

我可以做些什么来获得我想要的结果?

除了使用find -exec解释unxnut之外,另一种方法是将-o(或--open-tty)选项与xargs一起使用:

find -name '#*#' -print0 | xargs -0 -o rm -i

这可能是理想的方式,因为它允许rm -i按照设计处理交互式确认。

另一种方法是将-p(或--interactive)选项与xargs一起使用:

find -name '#*#' -print0 | xargs -0 -p rm

使用此方法,xargs处理交互式确认,而不是让rm执行此操作。您可能还想使用-n 1,以便每个提示只询问一个文件:

find -name '#*#' -print0 | xargs -0 -p -n 1 rm

使用xargs优于find -exec的优势在于,您可以将其用于生成文件路径参数的任何命令,而不仅仅是find