Shell 使用find和xargs交互删除文件
我正试图通过管道将一些文件从find命令传输到interactiveremove命令,这样我就可以再次检查要删除的文件,但我遇到了一些麻烦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 -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{}代码>