Answers:
您正在尝试做的是递归删除。为此,您需要一个递归工具,例如find
。
find FOLDER -type f -delete
与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/**/*(.)
如果您的版本find
不支持-delete
,则可以使用以下命令删除当前目录及以下目录中的每个文件。
find . ! -type d -exec rm '{}' \;
-exec rm {} +
会更快,尤其是在有很多文件的情况下。
find . ! -type d -exec rm {} +
删除符号链接。
find
不支持,-delete
则可能也不支持-exec ... {} +
。推荐的解决方法是find ... -print0 | xargs -r0 rm
(如果期望许多潜在的匹配)。
-exec ... {} +
是POSIX,但-delete
不是。(-print0
顺便说一句也不是。)
find
支持-print0
但不支持的非POSIX 实现-exec ... {} +
(-delete
尽管我不记得了)。一个在OS X上,另一个在Solaris上(几年前在一个非常保守的更新系统上)。您也可以替代-print0
使用-printf '%p\0'
。无论如何,这是Ask Ubuntu,而不是Unix&Linux,而Ubuntu永远使用GNU find。