【问题标题】:Delete all files but keep all directories in a bash script?删除所有文件但将所有目录保留在 bash 脚本中?
【发布时间】:2023-03-04 15:44:01
【问题描述】:

我正在尝试做一些可能非常简单的事情,我有一个目录结构,例如:

dir/
    subdir1/
    subdir2/
        file1
        file2
        subsubdir1/
            file3

我想在 bash 脚本中运行一个命令,该命令将递归地从 dir 向下删除所有文件,但保留所有目录。即:

dir/
    subdir1/
    subdir2/
        subsubdir1

什么是合适的命令?

【问题讨论】:

    标签: bash shell


    【解决方案1】:
    find dir -type f -print0 | xargs -0 rm
    

    find 以递归方式列出与给定目录中特定表达式匹配的所有文件。 -type f 匹配常规文件。 -print0 用于使用\0 作为分隔符打印名称(因为任何其他字符,包括\n,可能在路径名中)。 xargs 用于从标准输入中收集文件名并将它们作为参数。 -0 是为了确保 xargs 能够理解 \0 分隔符。

    xargs 如果参数列表太大,可以多次调用rm。所以这比试图打电话要好得多。喜欢rm $((find ...)。它也比单独为每个文件调用rm 快得多,例如find ... -exec rm \{\}

    【讨论】:

      【解决方案2】:

      使用 GNU 的 find,您可以使用 -delete 操作:

      find dir -type f -delete
      

      使用标准find,您可以使用-exec rm

      find dir -type f -exec rm {} +
      

      【讨论】:

        【解决方案3】:
        find dir -type f -exec rm '{}' +
        

        【讨论】:

        • -exec 命令可以通过两种方式终止:分号或加号。如果您使用分号,则会为每个文件生成一个新进程。如果使用加号,则只生成一个进程。 (实际上,如果命令行变得太长,则会产生多个进程——基本上,它的工作方式类似于xargs,但没有所有引用问题。)假设您有两个文件,分别称为 A 和 B。然后,使用分号将产生两个进程:rm Arm B。加上加号,只会产生一个进程:rm A B
        【解决方案4】:
        find dir -type f -exec rm {} \;
        

        其中 dir 是您要从中删除文件的顶级目录

        请注意,这只会删除常规文件,不会删除符号链接,不会删除设备等。如果要删除目录以外的所有内容,请使用

        find dir -not -type d -exec rm {} \;
        

        【讨论】:

        • 这取决于外壳,真的。 “大括号扩展”可能发生在新的 bash 或 zsh 中。这就是为什么我总是逃避他们。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        • 1970-01-01
        • 1970-01-01
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多