showディレクトリを使用する場合、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より大きいリンク数がそのディレクトリのサブディレクトリ(リンク)数と一致すると仮定するのは安全ですか..
?
答え1
これは通常Unixシステムでは、ディレクトリへのリンクの数はサブディレクトリの数に2を加えたものです。これは正しいです。ただし、次の場合はそうではありません。
一部の unices はディレクトリへのハードリンクを許可します。これにより、サブディレクトリに対応しないリンクが2つ以上あるようになります。
.
一部のファイルシステムディレクトリにはエントリがありません..
。これGNU検索マニュアル-noleaf
そのオプションを議論するとき(すべてのディレクトリに存在すると仮定される最適化を無効にするために)、いくつかの例が挙げられます。「CD-ROMまたはMS-DOSファイルシステムまたはAFSボリュームマウントポイント」.
..
サブディレクトリの数を数える最も信頼できる方法(ファイル名に改行文字が含まれている場合はまだ失敗する可能性があります)は次のとおりです。
$(($(LC_ALL=C ls -la /path/to/directory | grep '^d' | wc -l) - 2)
より安定した方法はシェルグローブを使用することです*/
。.*/
通常どおりパターンの不一致を処理するのは少し面倒です(nullglob
オプションを設定できるbashとzshではありません)。
答え2
Bashでサブディレクトリを計算する別の方法(非再帰的)は次のとおりです。
(
shopt -s nullglob dotglob
printf '%s\000' */ | tr -dc '\0' | wc -c # wc counts null bytes
)
すべてのファイル名はASCII NUL文字で終わるため、ファイル名に改行文字が含まれていてもファイルは正常に機能します。
答え3
あなたは試すことができます:
ls -l |grep ^d | wc -l
答え4
ls
これを使用しないでください。適切な方法ですみんなファイル名は、改行文字を含むファイルでもファイル名ではなく改行文字のみを印刷するため、次のようになります。
find . -mindepth 1 -maxdepth 1 -type d -printf '\n' | wc -l
編集:現在のバージョンは以前と-mindepth
同様に警告を発しません(時間を節約するためにディレクトリを確認する前にディレクトリツリーをクリーンアップします)。-maxdepth
-type