find:`./folder':没有这样的文件或目录

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

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文件demo.c 。 下面是我提出的命令:

 find . ! \( -name demo.c -o -name . \) -exec rm -Rf {} \; 

它的确如你所想的那样(意思是说,文件test和目录folder不见了),但是同时它也显示下面的错误信息:

 find: `./folder': No such file or directory 

你为什么这么认为?

Solutions Collecting From Web of "find:`./folder':没有这样的文件或目录"

它也显示这个错误信息:

 find: `./folder': No such file or directory 

这是为什么?

因为find首先读取目录时将./folder识别为目录. ,然后再考虑是否符合find标准或对其执行任何操作。 它不能识别该动作将删除该目录,因此在执行动作之后,它将尝试下降到该目录以扫描其内容。 但是,到目前为止,该目录不再存在。

有多种方法来解决这个问题。 还没有提到的是使用-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
  • 删除将删除所有的文件和目录
 #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