Shell 使用find和xargs交互删除文件

Shell 使用find和xargs交互删除文件,shell,xargs,rm,Shell,Xargs,Rm,我正试图通过管道将一些文件从find命令传输到interactiveremove命令,这样我就可以再次检查要删除的文件,但我遇到了一些麻烦 find -name '#*#' -print0 | xargs -0 rm -i 我原以为上面的方法行得通,但我得到的却是一个字符串“rm:remove regular file./some/path/#someFile.js”?rm:remove regular file./other/path/#anotherFile#?…” 有人能告诉我到底发生了

我正试图通过管道将一些文件从find命令传输到interactiveremove命令,这样我就可以再次检查要删除的文件,但我遇到了一些麻烦

find -name '#*#' -print0 | xargs -0 rm -i
我原以为上面的方法行得通,但我得到的却是一个字符串
“rm:remove regular file./some/path/#someFile.js”?rm:remove regular file./other/path/#anotherFile#?…”


有人能告诉我到底发生了什么,我能做些什么来达到我想要的结果吗?谢谢。

您可以使用
exec
选项和
find
来完成此操作。使用命令

find . -name '#*#' -exec rm -i {} \;
xargs
将不起作用(除非您使用诸如
-o
-p
之类的选项),因为它使用
stdin
生成命令。由于
stdin
已在使用中,因此无法使用
rm
输入查询响应

有人能告诉我到底发生了什么吗

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

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

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

除了使用unxnut解释的
find-exec
外,另一种方法是使用
-o
(或
--open tty
)选项和
xargs

find -name '#*#' -print0 | xargs -0 -o rm -i
find -name '#*#' -print0 | xargs -0 -p rm
这可能是理想的方法,因为它允许
rm-i
按照设计本身处理交互确认

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

find -name '#*#' -print0 | xargs -0 -o rm -i
find -name '#*#' -print0 | xargs -0 -p rm
使用这种方法,
xargs
处理交互确认,而不是让
rm
执行。您可能还希望使用
-n1
,以便每个提示仅询问一个文件:

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

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

更多详细信息:如果
xargs
正在从
stdin
读取项目(即,如果它没有使用
-a
从文件读取项目),然后为每个命令从
/dev/null
重定向
stdin
。因此,请求确认的提示无法由用户回答。您应该使用-ok:
find-name'#*#'-ok rm{}