我已获得一个要运行的脚本,但在调用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 ...)
,因为如果任何文件名包含空格,您将遇到问题。
看:
- Bash 陷阱在 mywiki.wooledge.org 中
- 为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?
(* 正如文本所暗示的,该名称-depth
对于前序/后序切换来说是不准确的。)