如何递归删除子目录和文件,但不删除第一个父目录?

如何递归删除子目录和文件,但不删除第一个父目录?

我可以使用以下方法删除目标目录并递归删除其所有子目录和内容。

find '/target/directory/' -type d -name '*' -print0 | xargs -0 rm -rf

但是,我并不想删除目标目录。如何才能只删除目标中的文件、子目录及其内容?

答案1

前面的答案几乎是正确的。但是,你不应该引用shell glob 字符如果你想让它们工作。所以,这是你要找的命令:

rm -rf "/target/directory with spaces/"*

请注意,* 在双引号之外。此形式也有效:

rm -rf /target/directory\ with\ spaces/*

如果您*如上所示将 放在引号中,那么它将只会尝试删除*目标目录内字面上命名的单个文件。

答案2

另外三个选项。

  1. find-mindepth 1和 一起使用-delete

    −mindepth levels
    不要在低于 levels(非负整数)的级别应用任何测试或操作。
    −mindepth 1 表示处理除命令行参数之外的所有文件。

    -delete
    删除文件;如果删除成功则为 true。如果删除失败,则发出错误消息。如果 −delete 失败,find 的退出状态将为非零(当它最终退出时)。使用 −delete 会自动打开 −depth 选项。
    在使用此选项之前,请先使用 -depth 选项仔细测试。

    # optimal?
    # -xdev      don't follow links to other filesystems
    find '/target/dir with spaces/' -xdev -mindepth 1 -delete
    
    # Sergey's version
    # -xdev      don't follow links to other filesystems
    # -depth    process depth-first not breadth-first
    find '/target/dir with spaces/' -xdev -depth -mindepth1 -exec rm -rf {} \;
    



2. 使用find,但针对的是文件,而不是目录。这样就无需rm -rf

    # delete all the files;
    find '/target/dir with spaces/' -type f -exec rm {} \;

    # then get all the dirs but parent
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -exec rmdir {} \;

    # near-equivalent, slightly easier for new users to remember
    find '/target/dir with spaces/' -type f -print0 | xargs -0 rm
    find '/target/dir with spaces/' -mindepth 1 -depth -type d -print0 | xargs -0 rmdir



3. 继续删除父目录,但重新创建它。您可以创建一个 bash 函数来使用一个命令执行此操作;这里有一个简单的单行命令:

    rm -rf '/target/dir with spaces' ; mkdir '/target/dir with spaces'

答案3

怎么样

rm -rf /target/directory\ path/*

如果目标目录中可能有以 . 开头的文件。

rm -rf "/target/directory path/*" "/target/directory path/.??*"

第二个将匹配以 . 开头的所有内容,除了 . 和 .。它将在 .a 这样的名称上失败,但这种情况并不常见。如有必要,可以对其进行调整以涵盖所有情况。

答案4

find /target/directory/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

相关内容