web-dev-qa-db-ja.com

./および../ディレクトリとは何ですか?

簡単な質問ですが、どこを見ればよいのかわかりません。Googleはピリオドやスラッシュに応答しません。

現在のディレクトリ(サブフォルダー/ファイルを含まない)内のファイルとディレクトリの数を数えようとしているだけであり、ls -1 | wc -lls | wc -lは同一に見えるため、区別しようとしました。私が見ていたサイトは言った"これは./および../ディレクトリもカウントしていることに注意してください。"ls -1のあるサイトに関して、つまり、以前のディレクトリや何か(私は望んでいない)が含まれていますが、テストではそうではないようです。

誰かが現在のディレクトリのみ(サブではなく)のファイルとディレクトリの数を数えるのに最も適切であるものと、それらが./および../ディレクトリで何を意味するかを確認できますか?

20
Adam

Unixシステムのすべてのディレクトリ(およびおそらく他のすべてのシステム)には、少なくとも2つのディレクトリエントリが含まれています。これらは.(現在のディレクトリ)と..(親ディレクトリ)です。ルートディレクトリの場合、これらは同じ場所を指しますが、他のディレクトリとは異なります。これは、statpwd、および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
/
$

binsbinにはそれぞれ2つのリンクがあることに注意してください。 1つはルートディレクトリのディレクトリエントリで、もう1つはそのディレクトリ内の.エントリです。

lswc -lへのパイプと共に使用することは、lsの出力の行数をカウントする簡単な方法です。各ファイルまたはディレクトリが出力の1行を占めることを前提としています。 GNU lsは、出力が非端末の場合、これを自動的に行います。他の人は、動作を明示的にオンにするために-1オプションを必要とする場合があります。wc -lは単純にカウントします入力に行数(-l)を出力します。

このアプローチの問題は、LinuxとLinuxで従来から使用されているファイルシステムでは、ファイル名とディレクトリ名(これらの点では実際にはまったく同じ)が改行文字を含めることが許可されているであることです。それらが存在する場合、どちらの方法も崩れます。これらのエントリは、実際には1つでも、2つ以上のエントリとしてカウントされます。

GNU lsを使用している限り、改行文字を含む名前のディレクトリエントリはなく、lsの奇妙なエイリアスはありません(例:ls -a) 、どちらも現在の(または指定された)ディレクトリ内のファイルとディレクトリの数を出力します。ほとんどの場合、これで十分ですが、一般の場合は無効です。

ディレクトリエントリ名の異常な文字(主に改行)を適切に処理する必要がある場合は、lsの-bオプションを使用してエスケープすることをお勧めします。 ls -1bAは、各ディレクトリエントリ名を1行に出力し、異常な文字をエスケープします(各ディレクトリエントリは1つとして表示されます)。現在のディレクトリ内のファイルとディレクトリの数を報告するwc -lの完全なコマンドラインを取得するには、ls -1bA | wc -lをタックします(ただし、...は無視してください。 -aおよび-A)。ただし、サブディレクトリには含まれません。ドットファイルを合計に含めない場合は、ls-Aパラメータを省略してください。

15
a CVn

件名の質問に答えるには:

UnixでディレクトリBが作成されると、別のディレクトリA(その親ディレクトリ)への新しいエントリとして追加され、Bでは、2つのエントリが追加されます。1つはそれ自体へのハードリンクとして_._と呼ばれ、 Aへのハードリンクとして_.._と呼ばれるもの。

これらは許可されたディレクトリへの唯一のハードリンクです(ただし、一部のUnicesの一部の古いバージョンでは任意のリンクも許可されていました)。

そのため、ほとんどのファイルシステムでは(btrfsは注目すべき例外です)、ディレクトリのlinksの数は、サブディレクトリがいくつあるかを示します(_.._エントリを考慮) )。

ディレクトリの名前を変更または移動するときに、同じディレクトリ(別の名前)にある場合は、Aの名前エントリのみが変更されます。 Bの_._および_.._は影響を受けません。ただし、別のディレクトリに移動すると、Bの_.._が変更されます。これが、別のディレクトリに移動しない限り(親ディレクトリへの書き込みアクセス権があると仮定して)、書き込みアクセス権がないディレクトリの名前を変更できる理由を説明します(そうでない場合、_.._エントリは、それを移動できないようにします)。

ただし注意してください:_/a/b/../c_は他のディレクトリへのsymbolicリンクである可能性があるため、_/a/c_は_/a/b_と同じではない可能性があります。

その例外は、そのパスが一部のシェルのcdコマンドに指定されている場合です。これらのcdsは、ディレクトリ内の_.._エントリを無視して_.._logicallyを扱います。適切に記述されたスクリプトで_cd -P_が頻繁に表示される理由。これを無効にすると、混乱や矛盾が生じる可能性がありますfeature

bashで_._および_.._を除く現在のディレクトリのエントリ数を数えるには、次のようにします。

_shopt -s nullglob dotglob
set -- *
echo "$#"
_

Zshの場合:

_f=(*(ND))
echo $#f
_

ポータブル:

_find . ! -name . -Prune -print | grep -c /
_
6

私はLinuxの専門家ではありませんが、Linux(16年前はSlackwareの管理者でした)を知っています。

./および../ディレクトリは簡単です。は現在のディレクトリ、..は前のディレクトリ(pwd -local directoryコマンドのツリー内)

それらを数える場合、私は彼らがリストの合計に2を加えると考えています。実際には再帰的に移動せず、現在のディレクトリの下のディレクトリを数え、現在のディレクトリ(。)も数えます:))

したがって、基本的には、現在のディレクトリ内のcount(files)に値2を追加すると思います。

私が間違っていれば誰でも私を訂正します。

私は助けるために投稿しているだけで、誰もこの質問に答えなかったので、忙しいかもしれません。しかし、実験して、10個のファイルがあり、12個のカウントが得られるかどうかを確認してください。

1
Adrian Tanase