使用“find”循环目录。 -深度 1 -类型 d`

使用“find”循环目录。 -深度 1 -类型 d`

我已获得一个要运行的脚本,但在调用find . -depth 1 -type d.它会产生以下错误,

find: paths must precede expression: `1'

这是失败的那一行,

for dir in `find . -depth 1 -type d`
do
    ....

我尝试了很多事情但没有成功。我真的不明白为什么它会给出错误,因为至少在我看来,路径确实在“1”之前。

答案1

-depth开关不带参数,但是-maxdepth does,所以:

for dir in `find . -depth -maxdepth 1 -type d`
do
    ....

应该管用。

-depth手册页中的参数意味着首先处理目录内容。

答案2

该命令是为 FreeBSD 版本find(或类似版本)编写的,并且您正在使用另一个不支持.根据错误消息,可能是 GNU 的。 FreeBSD 版本有两个选项(-depth n-depth手册页):

-深度
始终为真;与不可移植的 -d 选项相同。使 find 执行深度优先遍历,即按后序访问目录,并且目录中的所有条目将在目录本身之前执行。默认情况下,find 按顺序访问目录,即在其内容之前。注意,默认不是广度优先遍历。

-深度 n
如果文件相对于遍历起点的深度为 n,则为真。

第一个是标准的(*),第二个不是。由于标准的不带参数,并且不能在 find 表达式之内或之后给出单独的参数(路径)(如您所见),因此 FreeBSD 版本可以在某种程度上摆脱覆盖名称的麻烦。 (它可能仍然容易出错,因为忘记参数 to-depth会改变含义。)

GNU 和 Busybox 具有同样的非标准,当它们一起使用时可以用于需要特定的深度:-mindepth n-maxdepth n

find . -mindepth 1 -maxdepth 1 -type d

请注意,您可能不应该使用for f in $(find ...),因为如果任何文件名包含空格,您将遇到问题。

看:

(* 正如文本所暗示的,该名称-depth对于前序/后序切换来说是不准确的。)

相关内容