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

Cop*_*Run 10 shell rm xargs

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

find -name '#*#' -print0 | xargs -0 rm -i
Run Code Online (Sandbox Code Playgroud)

我以为上面会有用,但我只是得到一串 "rm: remove regular file ./some/path/#someFile.js#? rm: remove regular file ./another/path/#anotherFile#?..."

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

unx*_*nut 12

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

find . -name '#*#' -exec rm -i {} \;
Run Code Online (Sandbox Code Playgroud)

xargs将无法工作(除非您使用-o或等选项-p),因为它用于stdin构建命令.由于stdin已经在使用,您无法输入查询响应rm.


Lar*_*rsH 7

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

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

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

我能做些什么才能得到我想要的结果呢?

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

find -name '#*#' -print0 | xargs -0 -o rm -i
Run Code Online (Sandbox Code Playgroud)

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

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

find -name '#*#' -print0 | xargs -0 -p rm
Run Code Online (Sandbox Code Playgroud)

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

find -name '#*#' -print0 | xargs -0 -p -n 1 rm
Run Code Online (Sandbox Code Playgroud)

使用xargsover 的优点find -exec是可以将它与任何生成文件路径参数的命令一起使用,而不仅仅是使用find.