假设我有一个这样的目录树:
FOLDER:
file1
file2
file3
Subfolder1:
file1
file2
Subfolder2:
file1
file2
如果我使用rm -r FOLDER/*
,FOLDER 中的所有内容(包括子目录)都将被删除。如何删除 FOLDER 及其子目录中的所有文件而不删除实际目录?
答案1
您要尝试执行的是递归删除。为此,您需要一个递归工具,例如find
。
find FOLDER -type f -delete
答案2
和bash
:
shopt -s globstar ## Enables recursive globbing
for f in FOLDER/**/*; do [[ -f $f ]] && echo rm -- "$f"; done
这里迭代 glob 扩展的文件名,并仅删除文件。
以上是试运行,如果对要进行的更改感到满意,则删除echo
以进行实际删除:
for f in FOLDER/**/*; do [[ -f $f ]] && rm -- "$f"; done
最后,取消设置globstar
:
shopt -u globstar
利用zsh
glob 限定符:
echo -- FOLDER/**/*(.)
(.)
是 glob 限定符,它将 glob 扩展限制为仅限常规文件。
以上只会打印文件名,以便实际删除:
rm -- FOLDER/**/*(.)
答案3
如果您的版本find
不支持,-delete
您可以使用以下命令删除当前目录及以下目录下的每个文件。
find . ! -type d -exec rm '{}' \;