我希望做一些可能非常简单的事情,我有一个目录结构,例如:
dir/
subdir1/
subdir2/
file1
file2
subsubdir1/
file3
我想在Bash脚本中运行一个命令,可以递归地删除从目录往下的所有文件,但是保留所有目录。例如:dir/
subdir1/
subdir2/
subsubdir1
这个需要什么样的命令?
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 \{\}
)更快。
使用 GNU 的 find
命令,可以使用 -delete
动作:
find dir -type f -delete
使用标准的find
命令,您可以使用-exec rm
来删除文件:
find dir -type f -exec rm {} +
find dir -type f -exec rm {} \;
其中dir是您想要删除文件的顶层目录。
请注意,这将仅删除常规文件,而不是符号链接、设备等。如果您想删除除目录以外的所有内容,请使用:
find dir -not -type d -exec rm {} \;
find dir -type f -exec rm '{}' +