删除所有文件,但将所有目录保存在bash脚本中?
我试图做一些这可能是很简单的,我有一个目录结构,如:删除所有文件,但将所有目录保存在bash脚本中?
dir/
subdir1/
subdir2/
file1
file2
subsubdir1/
file3
我想运行在bash脚本的命令,将dir命令递归地删除所有文件向下,但保留所有目录。即:
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 \{\}
。
+1,测试结果不错:-) – Grundlefleck 2009-08-14 22:09:44
+1用于处理文件名中的空格和其他“意外”字符。 – chepner 2012-02-14 14:35:16
find dir -type f -exec rm {} \;
其中DIR是你想从
注意删除文件,如果你想删除的一切,这只会删除常规文件,而不是符号链接,而不是设备等顶级除了目录,使用
find dir -not -type d -exec rm {} \;
+1,测试良好:) – Grundlefleck 2009-08-14 22:08:48
+1。我添加了引号,因为它们在处理包含空格的文件名时非常重要。 – Stephan202 2009-08-14 22:11:45
@ Stephan202这是不正确的。就shell而言''{}''和'{}'是一样的,'find'在shell将命令行参数传递给'find'之前删除了引号。 – 2009-08-14 22:27:25
find dir -type f -exec rm '{}' +
'+'是什么? – Grundlefleck 2009-08-14 22:31:30
'-exec'命令可以通过两种方式终止:使用分号或加号。如果使用分号,则会为每个文件生成一个新进程。如果您使用加号,则只会生成一个进程。 (实际上,如果命令行变得太长,那么会产生多个进程 - 基本上,它的工作方式与'xargs'相似,但没有所有引用问题。)说,有两个文件,称为A和B.然后,用分号会产生两个过程:'rm A'和'rm B'。使用plus,只会产生一个进程:'rm A B'。 – 2009-08-14 22:52:52
随着GNU的find
可以使用-delete
行动:
find dir -type f -delete
使用标准find
您可以使用-exec rm
:
find dir -type f -exec rm {} +
为-delete标志+1 – Christoffer 2009-08-21 10:26:00
看起来更像是一个超级用户的问题对我来说,你不觉得吗? – 2009-08-14 22:09:23
不,我写了一个bash脚本,这是编程,并且在这个网站上有很多bash脚本问题:-) – Grundlefleck 2009-08-14 22:11:35
shell脚本算作编程,在我看来 – 2009-08-14 22:12:04