を使用してディレクトリを表示する場合ls -l
、リンクの数(出力の2番目のフィールド)は少なくとも2つです。1つはディレクトリ名用、もう1つは.
$ mkdir foo
$ ls -l
total 2
drwxr-xr-x 2 user wheel 512 4 oct 14:02 foo
2を超えるリンクの数がこのディレクトリ(..
リンク)のサブディレクトリの数に対応すると常に想定するのは安全ですか?
を使用してディレクトリを表示する場合ls -l
、リンクの数(出力の2番目のフィールド)は少なくとも2つです。1つはディレクトリ名用、もう1つは.
$ mkdir foo
$ ls -l
total 2
drwxr-xr-x 2 user wheel 512 4 oct 14:02 foo
2を超えるリンクの数がこのディレクトリ(..
リンク)のサブディレクトリの数に対応すると常に想定するのは安全ですか?
回答:
UNIXシステムでは通常、ディレクトリへのリンクの数はサブディレクトリの数に2を加えた数です。ただし、これが当てはまらない場合もあります。
一部のuniceでは、ディレクトリへのハードリンクを許可しています。次に、サブディレクトリに対応しない2つ以上のリンクがあります。
ディレクトリに.
およびのエントリがないファイルシステムがあります..
。GNUマニュアルを見つけるには、そのの議論にいくつかの例を挙げ-noleaf
(ことを前提として最適化無効にするオプション.
と..
、「CD-ROMまたはMS-DOSファイルシステムまたはAFSのボリュームマウントポイントを」:すべてのディレクトリ内に存在します)
サブディレクトリの数を数えるほとんど信頼できる方法です(ファイル名に改行文字が含まれている場合でも失敗する可能性があります)。
$(($(LC_ALL=C ls -la /path/to/directory | grep '^d' | wc -l) - 2)
より信頼できる方法は、シェルグロブ*/
と.*/
;を使用することです。通常どおり、パターンが一致しない場合の処理は少し面倒です(nullglob
オプションをオンにできるbashおよびzshを除く)。
ls
これには使用しないでください。ファイル名ではなく改行文字のみを出力するため、改行を含むすべてのファイル名で機能する1つの方法を次に示します。
find . -mindepth 1 -maxdepth 1 -type d -printf '\n' | wc -l
編集:ので、現在のバージョンは、すべての警告にはなりません-mindepth
し、-maxdepth
前にする必要があります-type
(ディレクトリツリーは、時間を節約するために、ディレクトリをチェックする前に剪定されます)。
-type d
が、:1.これにはGNU findが必要です。2.開始ディレクトリから1を引く(またはパスする-mindepth 1
)必要があります。