要回答主题中的问题:
当在Unix中创建一个目录B,将其添加为新条目到另一个目录A(它的父目录),并在B,两项相加:一个叫.
作为硬链接本身,和一个叫..
作为硬链接到A。
那些是到目录的唯一硬链接(尽管某些Unices的某些旧版本也允许任意链接)。
这就是为什么大多数文件系统(btrfs
一个明显的例外),links
目录的数量表示该目录有多少个子目录(说明了它们的..
条目)。
重命名/移动目录时,如果它位于同一目录(使用不同的名称),则仅A
更改其中的名称条目。B .
且..
不受影响。但是,如果将其移动到另一个目录,则..
在B
将会更改。这就解释了为什么您可以重命名一个没有写访问权限的目录(假设您具有对父目录的写访问权限),只要您不将该目录移动到另一个目录(否则需要更改该..
条目会阻止您不要移动它)。
不过要当心: /a/b/../c
可能与/a/c
因为/a/b
可能是一个不一样指向其他目录符号链接不同。
一个例外是,当该路径被赋予cd
某些外壳程序的命令时。那些cd
在..
逻辑上忽略..
目录中的条目。您经常看到cd -P
使用正确编写的脚本来禁用该功能的原因,否则可能导致混乱和不一致。
要计算不包括当前目录条目的数量.
和..
与bash
,你可以这样做:
shopt -s nullglob dotglob
set -- *
echo "$#"
使用zsh:
f=(*(ND))
echo $#f
便携性:
find . ! -name . -prune -print | grep -c /