
我想删除文件夹“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
如您所见,keep1
和keep2
不在传递给命令的参数列表中ls
。请随意替换ls -gGd
为rm -vf
:)
如果您有更多的要求,可以调整括号中的参数。