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

PKM*_*PKM 26 command-line delete files rm

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

FOLDER:
    file1
    file2
    file3
    Subfolder1:
        file1
        file2
    Subfolder2:
        file1
        file2
Run Code Online (Sandbox Code Playgroud)

如果我使用rm -r FOLDER/*,FOLDER 中的所有内容都将被删除,包括子目录。如何在不删除实际目录的情况下删除 FOLDER 及其子目录中的所有文件?

Ser*_*nyy 41

您要做的是递归删除。为此,您需要一个递归工具,例如find.

find FOLDER -type f -delete
Run Code Online (Sandbox Code Playgroud)


hee*_*ayl 13

bash

shopt -s globstar  ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done
Run Code Online (Sandbox Code Playgroud)

这里迭代 glob 扩展的文件名,并仅删除文件。

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

for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done
Run Code Online (Sandbox Code Playgroud)

最后,取消设置globstar

shopt -u globstar
Run Code Online (Sandbox Code Playgroud)

使用zsh,利用 glob 限定符:

echo -- FOLDER/**/*(.)
Run Code Online (Sandbox Code Playgroud)

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

以上将只打印文件名,用于实际删除:

rm -- FOLDER/**/*(.)
Run Code Online (Sandbox Code Playgroud)

  • +1 用于 zsh globbing。更多的人应该知道 zsh 可以做的很棒的事情。 (2认同)

小智 11

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

find . ! -type d -exec rm '{}' \;
Run Code Online (Sandbox Code Playgroud)

  • @DavidFoerster 不是真的。`-exec ... {} +` 是 POSIX,但 `-delete` 不是。(顺便说一下,`-print0` 也不是。) (5认同)