我正在尝试做一些可能非常简单的事情,我有一个目录结构,例如:
dir/
subdir1/
subdir2/
file1
file2
subsubdir1/
file3
我想在bash脚本中运行一个命令,该命令将从dir中递归删除所有文件,但保留所有目录。即:
dir/
subdir1/
subdir2/
subsubdir1
对此有什么合适的命令?
答案 0 :(得分:41)
find dir -type f -print0 | xargs -0 rm
find
以递归方式列出给定目录中与某个表达式匹配的所有文件。 -type f
匹配常规文件。 -print0
用于使用\0
作为分隔符打印名称(因为任何其他字符,包括\n
,可能在路径名中)。 xargs
用于从标准输入中收集文件名并将它们作为参数。 -0
是为了确保xargs
能够理解\0
分隔符。
xargs
足够明智地多次调用rm
。所以它比试图打电话要好得多。比如rm $((find ...)
。此外,它比为每个文件调用rm
要快得多,例如find ... -exec rm \{\}
。
答案 1 :(得分:9)
使用GNU的find
,您可以使用-delete
操作:
find dir -type f -delete
使用标准find
,您可以使用-exec rm
:
find dir -type f -exec rm {} +
答案 2 :(得分:8)
find dir -type f -exec rm {} \;
其中 dir 是您要从
中删除文件的最高级别请注意,这只会删除常规文件,而不是符号链接,而不是设备等。如果要删除目录以外的所有内容,请使用
find dir -not -type d -exec rm {} \;
答案 3 :(得分:8)
find dir -type f -exec rm '{}' +