删除所有文件,但将所有目录保存在bash脚本中?

时间:2009-08-14 21:58:59

标签: bash shell

我正在尝试做一些可能非常简单的事情,我有一个目录结构,例如:

dir/
    subdir1/
    subdir2/
        file1
        file2
        subsubdir1/
            file3

我想在bash脚本中运行一个命令,该命令将从dir中递归删除所有文件,但保留所有目录。即:

dir/
    subdir1/
    subdir2/
        subsubdir1

对此有什么合适的命令?

4 个答案:

答案 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 '{}' +