(some) 下的任何内容都foo匹配-path '*/foo/*',但./path/to/foo本身不匹配。find不会在它创建和检查的路径中添加尾部斜杠。一个例外是类似于find /path/to/foo/ …where /path/to/foo/will be processes with a trailing slash and it will match -path '*/foo/*'。您可能会考虑-path '*/foo/?*',但如果您从/path/to/foo//(这是一个有效的路径名)开始,那么它将匹配。
请注意第二个链接(“关于在路径树中的第一个正数处停止搜索”)并不真正相关,因为忽略它的解决方案可能为空
./path/to/foo/again/foo
然后为空./path/to/foo
;或者它可能首先是空的./path/to/foo
并且根本没有到达./path/to/foo/again/foo
(因为这个路径现在不存在)。在任何情况下,目标都会达到。(some) 下的任何内容都
foo
匹配-path '*/foo/*'
,但./path/to/foo
本身不匹配。find
不会在它创建和检查的路径中添加尾部斜杠。一个例外是类似于find /path/to/foo/ …
where/path/to/foo/
will be processes with a trailing slash and it will match-path '*/foo/*'
。您可能会考虑-path '*/foo/?*'
,但如果您从/path/to/foo//
(这是一个有效的路径名)开始,那么它将匹配。所以也许
-path
和-name
?它会给你一个很好的删除路径名列表吗?注意
./path/to/foo/again/foo
不会在上面。该列表将包含./path/to/foo/again
,因此如果您again
正确删除,那么./path/to/foo/again/foo
无论如何都会被删除。不错,直到您意识到列表中没有允许您删除的条目./path/to/foo/foo/foo
(如果存在这样的路径)。另一个问题
-path '*/foo/*'
是当您以/a/foo/starting/point
. 在这种情况下,考虑的每条路径find
都将匹配。实际上,您可能无意中删除了整个point
,而您的意图是清空/a/foo/starting/point/whatever/foo/
。如果可以
cd
到起点,那么这应该是安全的:(
?
很可能不需要,因为规范明确指出,相对于我们作为起始路径提供的路径名部分中不应有斜杠;但我不知道是否所有的实现都find
严格遵守;所以?
以防万一)。即使
foo
出现在 的路径中starting/point
,也没关系。find
测试的是工具构建的路径名,而-path
不是实际的绝对路径名。当 find.
从那时开始时,它构建的所有路径名都将以字符串开头.
并将-path
它们作为字符串进行测试。注意
-delete
不可移植。便携式解决方案可能是以下之一:第一个的工作方式类似于
-delete
(这意味着-depth
):它仅在处理完目录的所有内容后才处理目录。rm
将以正确的顺序一一获取路径名,并且它实际上不需要递归工作,因为它尝试删除的任何目录都应该已经是空的(仍然-r
需要它才能删除目录)。多个路径名将被提供给一个,rm
多亏了+
,仍然可能会有多个,rm
因为您不能rm
使用任意多个参数运行。find -exec … +
知道这一点并且可以执行尽可能多的命令(rm
在我们的例子中是进程),因为它需要处理任意多的条目并且不达到限制(为了比较:xargs
也知道这一点)。在许多情况下,最佳的可移植解决方案是运行一个或几个
rm -r
进程来删除非目录和直接在 下的目录./path/to/foo/
,因此find
甚至不需要更深入。这就是第二个命令的作用。请注意,有;
(从外壳中逃脱)而不是+
. 我们不希望+
,因为它可能会find
决定 的内容./path/to/foo/
还不足以运行rm
许多参数,它会更深入地添加更多参数,找到 的内容./path/to/foo/again/foo/
,然后才开始rm
。所以rm -r
得到./path/to/foo/again
和(可能在其他中)./path/to/foo/again/foo/whatever
,它(递归地)删除前者,然后抱怨后者不存在。因此,如果没有-depth
,最好运行一个rm
每个路径名,所以-exec … \;
.但即便如此,不再存在的文件也可能会触发警告;不是来自,
rm
而是来自find
。这是因为find
在处理目录之前了解目录的内容。即使它要先处理目录(即即使没有-depth
),它也会这样做。rm
删除后./path/to/foo/again
find
仍会尝试处理./path/to/foo/again/whatever
。任何具有(显式或隐含)-depth
的解决方案都不会出现此问题。使用第一个可移植形式,带有
-depth
; 或更好的形式与-delete
,如果只有你的find
支持-delete
。旁注:如果你想清空一个特定的目录然后
cd
到它并且:find
您甚至不需要常见的实现,! -name .
因为它们不会删除.
,而且是设计使然。该命令简化为: