查找:"./文件夹":没有这样的文件或目录



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

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

相关内容

  • 没有找到相关文章

最新更新