Linux 查找:`./文件夹';:没有这样的文件或目录
这是我正在使用的目录的内容:Linux 查找:`./文件夹';:没有这样的文件或目录,linux,bash,shell,unix,find,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
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
命令更改为:
#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
find . -mindepth 1 -not -name demo.c -delete
确保您没有选择-mindepth 1
DOT
将删除所有文件和目录-delete
find: `./folder': No such file or directory
find: `./folder': No such file or directory
为什么呢
因为find
在第一次读取目录
时将/folder
识别为目录,然后再考虑它是否符合find
标准或对其执行任何操作。它无法识别该操作将删除该目录,因此在执行该操作后,它会尝试下降到该目录以扫描其内容。然而,当它这样做的时候,目录已经不存在了
有多种方法可以解决这个问题。还没有提到的一个是使用-prune
操作。这告诉find
不要进入与测试匹配的目录:
find . ! \( -name demo.c -o -name . \) -exec rm -Rf {} \; -prune
这将在这里很好地发挥作用,并且在您不想删除目录并且不想限制搜索深度的区域也有应用程序
此外,避免影响
的另一种方法是利用查找
接受多个基本路径进行测试的事实,如果您愿意,这些路径可以指定常规文件,并且在路径名扩展期间,文件名中的任何前导
都必须明确匹配。如果像您的情况一样,目标目录中没有点文件(除了
和。
),那么您可以像这样实现您的目标:
find * ! -name demo.c -exec rm -Rf {} \; -prune
明白了。我应该这样写:找到-最大深度1!(-name demo.c-o-name.)-exec rm-Rf{};我忘记了-maxdepth 1。
maxdepth 1
将只在当前目录中查找文件和目录,您仍然可以使用mindepth 1
避免排除DOT。您的命令可以是:find-mindepth 1-maxdepth 1-not-name demo.c-delete
tryfind-深度…
,否则find将尝试进入文件夹。/文件夹在删除后ls
不适用于编程使用,也不安全--另请参见,grep-v demo.c
将排除foo demo.c
,而OP的-name demo.c
则不适用;这个代码并不完全等同于它的替代品。对于一点乐趣,BTW,考虑文件可以在它们的名字中包含新行。用touch$'cant\ndelete\nme'
创建的东西将逃过ls-1 | grep-v demo.c | xargs rm-rf
方法,而不仅仅是因为xargs
行为不当(它确实这样做了——禁止扩展,例如-0
或-d
,它被设计破坏),但也因为ls-1
无法在新行分隔的输出流中明确表示该名称。此外,如果文件名中有空格,即触摸“hello残酷世界”
,您给出的xargs
用法将尝试删除三个单独的文件,hello
、Harry
、和world
,不要试图删除实际存在的文件。类似地,如果文件名中有引号,xargs
将尝试将它们视为语法。