find:`./folder&#39 ;:没有这样的文件或目录

时间:2016-05-20 13:13:12

标签: linux bash shell unix find

这是我正在使用的目录的内容:

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

为什么你认为那是?

3 个答案:

答案 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