我跑了
/bin/find /home/user/myfiles \! -name '.htaccess' -exec rm -r {} \;
它删除了一切在 myfiles
以及myfiles
目录本身(如果.htaccess
不存在)。
我所期望的是它会找到并删除目录中的文件(任何.htacess
文件除外)。
我做错了什么?
答案1
如果您的版本find
支持-delete
and -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
答案4
你告诉它递归删除/home/user/myfiles/
/home/user/myfiles/a
/home/user/myfiles/b
你没有告诉它删除/home/user/myfiles/c
。然而,告诉它递归删除/home/user/myfiles/
就足以删除所有内容。
排除 (of find
) 并没有说不要删除它。它说不要告诉命令 ( rm
) 这件事。