【问题标题】:Removing files interactively with find and xargs使用 find 和 xargs 交互删除文件
【发布时间】:2013-08-20 14:29:33
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: shell xargs rm


    【解决方案1】:

    您可以通过将exec 选项与find 一起使用来完成此操作。使用命令

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

    xargs 将不起作用(除非您使用-o-p 等选项),因为它使用stdin 来构建命令。由于stdin已被使用,因此您无法输入rm的查询响应。

    【讨论】:

    • 更多细节:如果xargs 正在从stdin 读取项目(即,如果它没有使用-a 从文件中读取项目),那么它将stdin/dev/null 重定向到每个命令。因此,用户无法回答要求​​确认的提示。 man7.org/linux/man-pages/man1/xargs.1.html
    • 你应该使用 -ok: find -name '#*#' -ok rm {} \;
    【解决方案2】:

    谁能给我解释一下到底发生了什么,

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

    由于您没有使用-a 选项,因此xargs 正在运行的每个rm -i 命令都从/dev/null 获取其标准输入(即没有可用的输入)。当rm 询问是否删除特定文件时,答案实际上是“否”,因为 /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

    【讨论】:

      【解决方案3】:

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

      find . -name '#*#' -delete
      

      【讨论】:

        猜你喜欢
        • 2017-08-07
        • 2021-01-13
        • 1970-01-01
        • 2014-01-18
        • 2016-02-02
        • 2018-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多