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


8

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

回答:


7

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を除く)。


2

Bashのサブディレクトリを(非再帰的に)カウントする別の方法を次に示します。

(
shopt -s nullglob dotglob
printf '%s\000' */ | tr -dc '\0' | wc -c  # wc counts null bytes
)

各ファイル名はASCII NUL文字で終了しているため、ファイル名に改行文字が含まれている場合でも、これは正しく機能するはずです。



1

リンクの数が常にサブディレクトリの数の+2になることを確認するドキュメントには何も見つかりません。

ただし、正しい量を見つけるには、次のコマンドを使用します。

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

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


私はあなたが意味したと思う-type dが、:1.これにはGNU findが必要です。2.開始ディレクトリから1を引く(またはパスする-mindepth 1)必要があります。
Gilles 'SO-悪をやめる'

0

lsこれには使用しないでください。ファイル名ではなく改行文字のみを出力するため、改行を含むすべてのファイル名で機能する1つの方法を次に示します。

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.