`find` 删除了顶级目录以及内容

`find` 删除了顶级目录以及内容

我跑了

/bin/find /home/user/myfiles \! -name '.htaccess' -exec rm -r {} \;

它删除了一切 myfiles以及myfiles目录本身(如果.htaccess不存在)。

我所期望的是它会找到并删除目录中的文件(任何.htacess文件除外)。

我做错了什么?

答案1

如果您的版本find支持-deleteand -mindepth(GNUfind或 macOS Monterey 或其他一些版本),您可以使用这些:

/bin/find /home/user/myfiles -mindepth 1 -delete

如果是其他的find,我会尝试像这样指定路径:

/bin/find /home/user/myfiles/*

它将您想要保留的目录下的内容全部合并,然后在find其下执行操作。

对于像 find 这样的工具来说,这是一个好主意,这些工具本质上是发现自己的操作参数,以便首先以非破坏性的方式运行它们,例如简单地列出事物或在删除它们之前对它们执行 ls 操作。

答案2

find从起始目录本身开始搜索。也就是说,如果你有

foo/
    a
    b

你跑

find foo

你会得到

foo
foo/a
foo/b

因此,当您这样做时-exec rm -r {} \;,它甚至会删除起始目录。您可以做的是告诉find不要包含起始目录:

find /home/user/myfiles ! -path /home/user/myfiles -exec rm -r {} \;

答案3

丹尼尔·沃克的回答解释了你的命令发生了什么以及修复它的一种方法(Stéphane Chazelas 提供了另一种选择在评论中)。知道如何使用是件好事 find。但是,如果您使用的是 Bash,则完成此特定工作的另一种方法是

(shopt -s dotglob  &&  cd /home/user/myfiles  &&  rm -r -- *)

您不需要find执行递归删除,因为rm内置了该功能。

答案4

你告诉它递归删除/home/user/myfiles/ /home/user/myfiles/a /home/user/myfiles/b你没有告诉它删除/home/user/myfiles/c。然而,告诉它递归删除/home/user/myfiles/就足以删除所有内容。

排除 (of find) 并没有说不要删除它。它说不要告诉命令 ( rm) 这件事。

相关内容