web-dev-qa-db-ja.com

`ls -l`を使用してディレクトリ内のサブディレクトリの数を確認できますか?

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を超えるリンクの数は、このディレクトリ内のサブディレクトリの数(..リンク)に対応すると常に想定しても安全ですか?

8
Eugene Yarmash

通常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文字で終了しているため、ファイル名に改行文字が含まれている場合でも、これは正しく機能するはずです。

2
matt

あなたはで試すことができます:

ls -l |grep ^d | wc -l
2
HandyGandy

documentation には、サブディレクトリの数に対してリンクの数が常に+2になることを確認するものが見つかりません。

ただし、正しい金額を見つけるには、次を使用します。

find . -type d -mindepth 1  -maxdepth 1 | wc -l

または、ls -lを使用する必要がある場合は、他の回答を参照してください。

1
Stefan

これにはlsを使用しないでください 。ファイル名の代わりに改行文字のみを出力するため、allファイル名を処理する1つの方法は、改行が含まれている場合でも次のとおりです。

find . -mindepth 1 -maxdepth 1 -type d -printf '\n' | wc -l

編集:-mindepth-maxdepth-typeの前にある必要があるため(時間を節約するために、ディレクトリツリーはディレクトリをチェックする前に整理されます)、現在のバージョンでは警告は表示されません。

0
l0b0