2009-08-14 126 views
21

我试图做一些这可能是很简单的,我有一个目录结构,如:删除所有文件,但将所有目录保存在bash脚本中?

dir/ 
    subdir1/ 
    subdir2/ 
     file1 
     file2 
     subsubdir1/ 
      file3 

我想运行在bash脚本的命令,将dir命令递归地删除所有文件向下,但保留所有目录。即:

dir/ 
    subdir1/ 
    subdir2/ 
     subsubdir1 

这将是一个合适的命令?

+0

看起来更像是一个超级用户的问题对我来说,你不觉得吗? – 2009-08-14 22:09:23

+4

不,我写了一个bash脚本,这是编程,并且在这个网站上有很多bash脚本问题:-) – Grundlefleck 2009-08-14 22:11:35

+4

shell脚本算作编程,在我看来 – 2009-08-14 22:12:04

回答

38
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 \{\}

+0

+1,测试结果不错:-) – Grundlefleck 2009-08-14 22:09:44

+0

+1用于处理文件名中的空格和其他“意外”字符。 – chepner 2012-02-14 14:35:16

8
find dir -type f -exec rm {} \; 

其中DIR是你想从

注意删除文件,如果你想删除的一切,这只会删除常规文件,而不是符号链接,而不是设备等顶级除了目录,使用

find dir -not -type d -exec rm {} \; 
+0

+1,测试良好:) – Grundlefleck 2009-08-14 22:08:48

+0

+1。我添加了引号,因为它们在处理包含空格的文件名时非常重要。 – Stephan202 2009-08-14 22:11:45

+0

@ Stephan202这是不正确的。就shell而言''{}''和'{}'是一样的,'find'在shell将命令行参数传递给'find'之前删除了引号。 – 2009-08-14 22:27:25

8
find dir -type f -exec rm '{}' + 
+1

'+'是什么? – Grundlefleck 2009-08-14 22:31:30

+3

'-exec'命令可以通过两种方式终止:使用分号或加号。如果使用分号,则会为每个文件生成一个新进程。如果您使用加号,则只会生成一个进程。 (实际上,如果命令行变得太长,那么会产生多个进程 - 基本上,它的工作方式与'xargs'相似,但没有所有引用问题。)说,有两个文件,称为A和B.然后,用分号会产生两个过程:'rm A'和'rm B'。使用plus,只会产生一个进程:'rm A B'。 – 2009-08-14 22:52:52

9

随着GNU的find可以使用-delete行动:

find dir -type f -delete 

使用标准find您可以使用-exec rm

find dir -type f -exec rm {} + 
+0

为-delete标志+1 – Christoffer 2009-08-21 10:26:00

相关问题