问题描述
假设我有一个这样的目录树:
FOLDER:
file1
file2
file3
Subfolder1:
file1
file2
Subfolder2:
file1
file2
如果我使用 rm -r FOLDER/*
,文件夹中的所有内容都将被删除,包括子目录。如何在不删除实际目录的情况下删除 FOLDER 及其子目录中的所有文件?
最佳办法
您要做的是递归删除。为此,您需要一个递归工具,例如 find
。
find FOLDER -type f -delete
次佳办法
使用 bash
:
shopt -s globstar ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done
这里迭代 glob 扩展的文件名,并仅删除文件。
上面是dry-run,如果对要进行的修改满意,则移除echo
进行实际移除:
for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done
最后,取消设置 globstar
:
shopt -u globstar
使用 zsh
,利用 glob 限定符:
echo -- FOLDER/**/*(.)
(.)
是 glob 限定符,它将 glob 扩展限制为仅常规文件。
以上将只打印文件名,用于实际删除:
rm -- FOLDER/**/*(.)
第三种办法
如果您的 find
版本不支持 -delete
,您可以使用以下命令删除当前目录及以下目录中的每个文件。
find . ! -type d -exec rm '{}' \;