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


13

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

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

但是,我不希望删除目标目录。如何仅删除目标文件,子目录及其内容?

Answers:


11

先前的答案几乎是正确的。但是,如果希望它们起作用,则不应该引用Shell Glob字符。因此,这是您要查找的命令:

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

请注意,*在双引号之外。这种形式也可以使用:

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

如果您具有*如上所示的in引号,则它将仅尝试删除*在目标目录中按字面命名的单个文件。


1
这不适用于隐藏的文件和文件夹。我曾与一个做一次
在Unfun猫

8

另外三个选择。

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

    -mindepth级别
    请勿以小于级别(非负整数)的级别应用任何测试或操作。
    -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'

2

怎么样

rm -rf /target/directory\ path/*

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

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

此秒将匹配以。开头的所有内容,除了。和..它将在.a之类的名称上失败,但这不是很常见。如有必要,可以对其进行调整以覆盖所有情况。


我都尝试过,但它们都不适合我。也许是因为我的目标目录路径中包含空格?rm -rf'/ target /目录路径/ *'它没有错误,但保留了子目录。
Michael Prescott 2010年

你需要躲避的空间,无论是用反斜杠(\)的空间之前,或在引号引起整个目录名(“)我编辑的例子来说明这一点。
KeithB

谢谢,我尝试了一下,就像我之前的评论中所示,仍然没有。(我正在使用OS X,这有关系吗?)
Michael Prescott 2010年

OS X应该工作正常,这就是我正在使用的。确保不要同时使用反斜杠和引号。只有一个或另一个。
KeithB 2010年

是的,仅使用引号即可。如果删除*,所以仅使用rm -rf“ / target / directory path /”,则“目录路径”目录将与“目录路径”子目录一起删除。如果我使用rm -rf“ / target / directory path / *”,则什么也不会发生。
Michael Prescott 2010年

2
find /target/directory/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.