通常,无论是Shell命令还是系统调用中,空字符串都不表示当前目录。它在某些较旧的系统上运行,但在POSIX兼容的系统上却没有。
有时,您会在传递空字符串时发现使用当前目录的程序,并且该程序需要目录名。有时这是故意的,有时会给定的字符串不是以斜杠开头时,在当前目录的绝对路径之前加上一个副作用。
对你来说最好的是离开./
。它没有任何危害。
如果文件列表用于
find . … | sed 's!^\./!!'
请注意,这会破坏某些包含换行符的文件名。通常,这对于人类的消费而言不是问题,并且find
由于其模棱两可,因此其输出也不适合程序消费。如果您使用的-print0
是适合程序使用的,那么您可能根本不关心./
前缀。
您可以使用find * …
代替find . …
,但请注意,find *
它存在许多缺陷,通常不适合使用:
.
被省略。
.
省略所有点文件(名称以或..` 开头的文件)。
- 如果在当前目录名称以一个文件名
-
(或称为文件!
或(
......),它会被解释为一个选项,或断言find
。
第一点与您的过滤器是否排除当前目录无关。第二点,您可以使用模式..?* .[!.]* *
来匹配当前目录中的所有文件,但是您需要检查每个模式是否至少匹配一个文件,如果不匹配则将其忽略。这是可能的,但是非常麻烦。最后一点是塞子。因此find *
可能适用于quickie命令行,但不要在脚本中使用它。
一种替代方法是使用外壳程序的递归遍历功能,例如
printf '%s\n' **/*.h
这需要通过shopt -s globstar
bash和set -o globstar
ksh93 来激活,并且在基本的POSIX shell(例如破折号)中不存在。默认情况下,不会遍历点文件;要包含它们,首先要使blob shopt -s dotglob
或FIGNORE='@(.|..)'
ksh93中的glob不能忽略点文件。另外,如果没有匹配项,则此命令将打印出图案;shopt -s nullglob
在bash中运行以打印空行,并~(N)**/*.h
在ksh中使用该模式。
在zsh中,默认情况下启用递归glob。使用glob限定词D
包括点文件,N
如果没有匹配项,则打印空行(默认情况下,如果模式与任何文件都不匹配,则zsh会引发错误)。您可以使用printf
上面的或
print -rl -- **/*.h(DN)
find
具有-printf参数来控制如何显示结果。find . -name '*.h' -printf '%P\n'
将删除./
前缀。看看能做什么find . -name '*.h' -print
。