这是我正在使用的目录的内容:
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
为什么你认为那是?
答案 0 :(得分:5)
它还会显示以下错误消息:
find: `./folder': No such file or directory
为什么?
因为find
在首次读取目录./folder
时将.
识别为目录,所以在考虑它是否符合find
条件或对其执行任何操作之前。它无法识别该操作将删除该目录,因此在执行该操作后,它会尝试进入该目录以扫描其内容。但是,当它这样做时,目录不再存在。
有多种方法可以解决这个问题。尚未提及的是使用-prune
操作。这告诉find
不要进入与测试匹配的目录:
find . ! \( -name demo.c -o -name . \) -exec rm -Rf {} \; -prune
这将在这里很好用,并且它还有一些应用程序,你不会删除目录,也不想限制搜索深度。
此外,避免影响.
的另一种方法是利用find
接受多个基本路径进行测试的事实,如果您愿意,这些可以指定常规文件,并且在路径名期间扩展名称中的任何前导.
都必须明确匹配。如果在您的情况下,目标目录中没有dotfiles(.
和..
除外),那么您可以像这样完成目标:
find * ! -name demo.c -exec rm -Rf {} \; -prune
答案 1 :(得分:2)
您可以将find
命令更改为:
find . -mindepth 1 -not -name demo.c -delete
-mindepth 1
确保您不会选择DOT
-delete
将删除所有文件和目录答案 2 :(得分:1)
#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