10

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

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

我认为上面的方法会起作用,但我只是得到一串"rm: remove regular file ./some/path/#someFile.js#? rm: remove regular file ./another/path/#anotherFile#?..."

有人可以向我解释到底发生了什么,以及我可以做些什么来获得我想要的结果?谢谢。

4

3 回答 3

13

You can do this by using exec option with find. Use the command

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

xargs will not work (unless you use options such as -o or -p) because it uses stdin to build commands. Since stdin is already in use, you cannot input the response for query with rm.

于 2013-08-18T19:28:58.393 回答
8

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

正如xargs 的手册页所说(在-a选项下):“如果使用此选项,则运行命令时标准输入保持不变。否则,标准输入将从 /dev/null 重定向。”

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

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

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

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

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

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

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

使用这种方法,xargs处理交互式确认而不是必须rm这样做。您可能还想使用-n 1,以便每个提示只询问一个文件:

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

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

于 2017-02-08T17:36:45.023 回答
1

您可以使用这个简单的命令来解决您的问题。

find . -name '#*#' -delete
于 2021-10-27T11:04:45.933 回答