Unixシステム上のすべてのディレクトリ(およびおそらく他のすべてのシステムも)には、少なくとも2つのディレクトリエントリが含まれています。これらは.
(現在のディレクトリ)と..
(親ディレクトリ)です。ルートディレクトリの場合、これらは同じ場所を指しますが、他のディレクトリとは異なります。これはstat
、Linux pwd
およびcd
Linuxのコマンドを使用して確認できます。
$ cd /
$ stat . .. bin sbin | grep Inode
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 2 Links: 27
Device: 802h/2050d Inode: 548865 Links: 2
Device: 802h/2050d Inode: 2670593 Links: 2
$ pwd
/
$ cd ..
$ pwd
/
$
注意事項bin
とsbin
それぞれが、それには2つのリンクがあります。1つはルートディレクトリのディレクトリエントリで、もう1つはそのディレクトリ.
内のエントリです。
ls
パイプへの使用は、wc -l
lsの出力の行数をカウントする簡単なトリックです。仮定は、各ファイルまたはディレクトリが出力で正確に1行を占めることです。GNU lsは、出力が非ターミナルの場合、これを自動的に行います。他のユーザーは-1
、動作を明示的にオンにするオプションが必要になる場合があります。入力のwc -l
行数(-l
)をカウントして出力するだけです。
このアプローチの問題は、LinuxおよびLinuxで伝統的に使用されているファイルシステムでは、ファイル名とディレクトリ名(実際にはこの点ではまったく同じ)に改行文字を含めることが許可されていることです。それらが存在する場合、どちらの方法もバラバラになります。実際にはそれらが1つである場合、それらのエントリは2つ以上のエントリとしてカウントされます。
GNU lsを使用している限り、改行文字を含む名前のディレクトリエントリがなく、ls
(たとえばls -a
)の奇妙なエイリアスはありません。両方とも、現在の(または指定された)ディレクトリ内のファイルとディレクトリの数を出力します。ほとんどの人にとってこれで十分ですが、一般的なケースでは有効ではありません。
ディレクトリエントリ名の異常な文字(主に改行)を適切に処理する必要がある場合は、lsの-b
オプションを使用してそれらをエスケープすることをお勧めします。ls -1bA
は、各ディレクトリエントリ名を独自の行に出力し、ドットファイルや-directoriesを含む、通常とは異なる文字をエスケープします(したがって、各ディレクトリエントリは1つとして表示されます)。上のタックwc -l
完全なコマンドの行のためにls -1bA | wc -l
、現在のディレクトリ内のファイルおよびディレクトリの数を報告しますた(ただし、無視.
して..
、違いだ-a
と-A
)が、任意のサブディレクトリに降りません。合計にカウントされるドットファイルが必要ない場合は、への-A
パラメーターを単に省略しますls
。