什么是删除所有文件但不删除目录的命令?


23

假设我有一个像这样的目录树:

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2

如果使用rm -r FOLDER/*,则会删除FOLDER中的所有内容,包括子目录。如何删除FOLDER及其子目录中的所有文件而不删除实际目录?

Answers:



13

bash

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done

在这里遍历全局扩展文件名,并仅删除文件。

以上是空运行,如果对要进行的更改感到满意,请删除echo以实际删除:

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done

最后,未设置globstar

shopt -u globstar

使用zsh,利用全局限定符:

echo -- FOLDER/**/*(.)

(.) 是glob限定词,它将glob扩展限制为仅常规文件。

上面只是打印文件名,实际删除是:

rm -- FOLDER/**/*(.)

2
+1表示zsh切换。更多的人应该意识到zsh可以做的令人敬畏的事情。
marcelm

11

如果您的版本find不支持-delete,则可以使用以下命令删除当前目录及以下目录中的每个文件。

find . ! -type d -exec rm '{}' \;

-exec rm {} +会更快,尤其是在有很多文件的情况下。
muru

find . ! -type d -exec rm {} +删除符号链接。
莫妮卡(Monica)的司法,

1
@muru:如果的特定实现find不支持,-delete则可能也不支持-exec ... {} +。推荐的解决方法是find ... -print0 | xargs -r0 rm(如果期望许多潜在的匹配)。
David Foerster

5
@DavidFoerster并非如此。-exec ... {} +是POSIX,但-delete不是。(-print0顺便说一句也不是。)
大师

@muru:足够公平。我至少遇到了两个find支持-print0但不支持的非POSIX 实现-exec ... {} +-delete尽管我不记得了)。一个在OS X上,另一个在Solaris上(几年前在一个非常保守的更新系统上)。您也可以替代-print0使用-printf '%p\0'。无论如何,这是Ask Ubuntu,而不是Unix&Linux,而Ubuntu永远使用GNU find。
David Foerster
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.