我正在尝试将一些文件从find命令传递到交互式删除命令,这样我就可以仔细检查我要删除的文件,但是我遇到了一些麻烦。
find -name '#*#' -print0 | xargs -0 rm -i
我认为上述方法可行,但我只是得到一串"rm: remove regular file ./some/path/#someFile.js#? rm: remove regular file ./another/path/#anotherFile#?..."
有人可以向我解释究竟发生了什么,以及我能做些什么才能得到我想要的结果?感谢。
答案 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
。