这是我正在使用的目录的内容:
misha@hp-laptop:~/work/c/5$ ls -l
total 8
-rw-rw-r-- 1 misha misha 219 May 20 15:37 demo.c
drwxrwxr-x 2 misha misha 4096 May 20 16:07 folder
-rw-rw-r-- 1 misha misha 0 May 20 16:06 test
现在,我想从这个目录中删除除文件demo.c
之外的所有内容。这是我想出的命令:
find . ! ( -name demo.c -o -name . ) -exec rm -Rf {} ;
它完全按照您的想法执行(意味着文件test
和目录folder
不见了),但同时它也显示以下错误消息:
find: `./folder': No such file or directory
你认为这是为什么?
它还显示以下错误消息:
find: `./folder': No such file or directory
为什么?
因为find
在第一次读取目录.
时,在考虑其是否符合find
标准或对其执行任何操作之前,会将./folder
识别为目录。它不识别该操作将删除该目录,因此在执行该操作后,它会尝试下入该目录以扫描其内容。然而,当它这样做时,该目录已不存在。
有多种方法可以解决这个问题。一个尚未提及的是使用-prune
动作。这个命令告诉find
不要进入与测试匹配的目录:
find . ! ( -name demo.c -o -name . ) -exec rm -Rf {} ; -prune
这在这里会很好地发挥作用,而且它在不删除目录和不想限制搜索深度的区域也有应用程序。
此外,避免影响.
的另一种方法是利用以下事实:find
接受多个基本路径进行测试,如果您愿意,这些路径可以指定常规文件,并且在路径名扩展期间,文件名中的任何前导.
都必须显式匹配。如果像您的情况一样,目标目录中没有点文件(除了.
和..
),那么您可以实现这样的目标:
find * ! -name demo.c -exec rm -Rf {} ; -prune
您可以将find
命令更改为:
find . -mindepth 1 -not -name demo.c -delete
-mindepth 1
确保不选择DOT
-delete
将删除所有文件和目录
#before
ls -lrt
total 4
-rw-rw-r-- 1 user super 0 May 20 09:14 demo.c
drwxrwxr-x 2 user super 4096 May 20 09:14 folder/
-rw-rw-r-- 1 user super 0 May 20 09:14 test
#Command
ls -1 | grep -v demo.c |xargs rm -rf
#After
ls -lrt
total 0
-rw-rw-r-- 1 user super 0 May 20 09:14 demo.c