删除文件夹中除一个文件之外的所有文件和目录

删除文件夹中除一个文件之外的所有文件和目录

我想删除文件夹“A”中的所有文件和目录。但除了该文件夹中的一个文件“keep”外。我尝试了以下命令。

找到 A !-name'.keep'-type f-exec rm-f {} +

但上述命令也会删除文件夹 A。我不想这样。有几个答案与此相关。但它们都提到进入该目录。我想在命令中提到该目录,而不是 cd-e 进入该目录。

答案1

find A ! -path A/.keep -a ! -path A -delete

答案2

简而言之,您找到想要保留的文件,然后经过-o(“或”的缩写)获取所有“其他”不匹配的文件,然后您就可以做任何您想做的事情。

另一个有用的参数是-mindepth 1,它可以让您轻松跳过顶层(级别 0)。

这是一个例子,像这样初始化树:

$ mkdir a a/b; touch a/{c,d,e,keep1} a/b/{f,g,h,keep2}

$ find a/ -exec ls -gGd {} +
drwxr-xr-x 1 18 Jul 12 14:31 a/
drwxr-xr-x 1 16 Jul 12 14:31 a/b
-rw-r--r-- 1  0 Jul 12 14:31 a/b/f
-rw-r--r-- 1  0 Jul 12 14:31 a/b/g
-rw-r--r-- 1  0 Jul 12 14:31 a/b/h
-rw-r--r-- 1  0 Jul 12 14:31 a/b/keep2
-rw-r--r-- 1  0 Jul 12 14:31 a/c
-rw-r--r-- 1  0 Jul 12 14:31 a/d
-rw-r--r-- 1  0 Jul 12 14:31 a/e
-rw-r--r-- 1  0 Jul 12 14:31 a/keep1

清除除“保留”文件之外的所有文件所需的命令可以是:

$ find a/ -mindepth 1 -name keep1 -o -name keep2 -o \( -not -type d -exec ls -gGd {} + \)
-rw-r--r-- 1 0 Jul 12 14:31 a/b/f
-rw-r--r-- 1 0 Jul 12 14:31 a/b/g
-rw-r--r-- 1 0 Jul 12 14:31 a/b/h
-rw-r--r-- 1 0 Jul 12 14:31 a/c
-rw-r--r-- 1 0 Jul 12 14:31 a/d
-rw-r--r-- 1 0 Jul 12 14:31 a/e

如您所见,keep1keep2不在传递给命令的参数列表中ls。请随意替换ls -gGdrm -vf:)

如果您有更多的要求,可以调整括号中的参数。

相关内容