Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 查找:`./文件夹';:没有这样的文件或目录_Linux_Bash_Shell_Unix_Find - Fatal编程技术网

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
try
find-深度…
,否则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
将尝试将它们视为语法。