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を加えたものです。ただし、これが当てはまらない場合もあります:
一部のユニスでは、ディレクトリへのハードリンクが許可されています。次に、サブディレクトリに対応しない3つ以上のリンクがあります。
ディレクトリに.
と..
のエントリがないファイルシステムがあります。 GNU find manual は、その-noleaf
オプション(.
および..
がすべてのディレクトリに存在すると想定する最適化を無効にする)の説明でいくつかの例を示しています。 「CD-ROMまたはMS-DOSファイルシステムまたはAFSボリュームマウントポイント」
サブディレクトリの数を数えるためのほぼ信頼できる方法(ファイル名に改行文字が含まれている場合でも失敗する可能性があります)は次のとおりです。
$(($(LC_ALL=C ls -la /path/to/directory | grep '^d' | wc -l) - 2)
より信頼性の高い方法では、シェルグロブ*/
および.*/
を使用します。いつものように、パターンが一致しない場合の処理は少し面倒です(nullglob
オプションをオンにできるbashとzshを除く)。
Bashでサブディレクトリを(非再帰的に)カウントするさらに別の方法は次のとおりです。
(
shopt -s nullglob dotglob
printf '%s\000' */ | tr -dc '\0' | wc -c # wc counts null bytes
)
各ファイル名はASCII NUL文字で終了しているため、ファイル名に改行文字が含まれている場合でも、これは正しく機能するはずです。
あなたはで試すことができます:
ls -l |grep ^d | wc -l
documentation には、サブディレクトリの数に対してリンクの数が常に+2になることを確認するものが見つかりません。
ただし、正しい金額を見つけるには、次を使用します。
find . -type d -mindepth 1 -maxdepth 1 | wc -l
または、ls -l
を使用する必要がある場合は、他の回答を参照してください。
これにはls
を使用しないでください 。ファイル名の代わりに改行文字のみを出力するため、allファイル名を処理する1つの方法は、改行が含まれている場合でも次のとおりです。
find . -mindepth 1 -maxdepth 1 -type d -printf '\n' | wc -l
編集:-mindepth
と-maxdepth
は-type
の前にある必要があるため(時間を節約するために、ディレクトリツリーはディレクトリをチェックする前に整理されます)、現在のバージョンでは警告は表示されません。