簡単な質問ですが、どこを見るべきかわかりません。 Google はピリオドやスラッシュには応答しません。
現在のディレクトリ(サブフォルダ/ファイルを除く)にあるファイルとディレクトリの数を数えて同じように見えるls -1 | wc -l
ので、それらを区別しようとしています。ls | wc -l
私が見たウェブサイトはこう言った。「ここには./と../ディレクトリも含まれていることを覚えておいてください。」に関しては、ls -1
それが以前のディレクトリや(私が望んでいない)ものを含むことを意味するかどうかはわかりませんが、テストを通してそれをしないようです。
現在のディレクトリ(サブディレクトリではない)にあるファイルとディレクトリの数だけを計算するのに最適なものは何ですか?
答え1
Unixシステム(およびおそらく他のすべてのシステム)のすべてのディレクトリには、少なくとも2つのディレクトリエントリが含まれています。.
(現在のディレクトリ)と..
(親ディレクトリ)です。ルートディレクトリの場合は同じ場所を指しますが、他のディレクトリの場合は異なります。 Linuxではstat
、およびコマンドを使用してpwd
直接確認できます。cd
$ 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つで同じ)が次のようになることです。改行文字を許可。どちらの方法も、これらの項目がある場合は機能しません。項目は実際には1つですが、複数の項目として計算されます。
ls
GNU lsを使用する限り、名前に新しい行を含むディレクトリエントリがなく、奇妙なエイリアス(たとえば)もなく、両方とも現在ls -a
(または指定された)ディレクトリにあるファイルとディレクトリの数を出力します。ほとんどの人にとってこれは十分ですが、実際には機能しません。一般的なケース。
ディレクトリエントリ名で異常な文字(主に改行)を正しく処理する必要がある場合は、-b
lsオプションを使用してエスケープすることをお勧めします。ls -1bA
各ディレクトリエントリ名は、ドットファイルやディレクトリを含む珍しい文字をエスケープして独自の行に印刷されます(したがって、各ディレクトリエントリは1つとして扱われます)。現在のディレクトリにあるファイルとディレクトリの数を報告するwc -l
完全なコマンドラインを追加します(およびは無視します。これとは違いです)、サブディレクトリには含まれません。ポイントファイルが合計に含まれたくない場合は、引数を省略してください。ls -1bA | wc -l
.
..
-a
-A
-A
ls
答え2
トピックの質問に答えてください。
UnixでディレクトリBが作成されると、別のディレクトリA(親)に新しいエントリとして追加され、Bに2つのエントリが追加されます。 1つは.
自分へのハードリンクと呼ばれ、もう1つは自分と呼ばれ..
ます。 ㅏ。
これは許可される唯一のディレクトリハードリンクです(一部の以前のバージョンのUniceはランダムリンクを許可しましたが)。
これがほとんどのファイルシステムでは(btrfs
注目すべき例外です)、ディレクトリ番号がlinks
サブディレクトリの数を表す理由です(該当する項目の説明..
)。
ディレクトリの名前を変更または移動すると、A
同じディレクトリにある場合(別の名前で)、名前エントリのみが変更されます。 B.
とは..
影響を受けません。ただし、別のディレクトリに移動すると..
inがB
変更されます。これは、書き込み権限のないディレクトリ(親ディレクトリへの書き込み権限があると仮定)の名前を別のディレクトリに移動しない限り(それ以外の場合はエントリを変更する必要がある場合)、名前を変更できる理由を説明します..
。動かないようにしてください)。
しかし、注意してください:mightはmay beとは/a/b/../c
異なります。/a/c
/a/b
象徴的な他のディレクトリへのリンク。
1つの例外は、パスがcd
特定のシェルコマンドに割り当てられている場合です。そのcd
治療法..
論理的に..
ディレクトリのエントリを無視します。適切に作成されたスクリプトでよく見られる理由の1つcd -P
は、その機能を無効にすることです。特徴そうしないと、混乱と不一致が発生する可能性があります。
.
sum を除く現在のディレクトリの..
項目数を数えるには、bash
次のようにします。
shopt -s nullglob dotglob
shopt -u failglob
set -- *
echo "$#"
zshを使う:
f=(*(ND))
echo $#f
または、匿名関数を一度使用し、ソートを最適化として無効にします。
(){echo $#} *(NDoN)
持ち運べる:
find . ! -name . -prune -print | grep -c /
答え3
私は素晴らしいLinuxの専門家ではありませんが、Linuxを知っています(16年前にSlackwareの管理者でした:)
./と../ディレクトリは簡単です。これらは現在のディレクトリで、..は古いディレクトリです(pwd -localディレクトリのコマンドツリーで -
計算してみると、実際に現在のディレクトリの下のディレクトリを再帰的に計算して現在のディレクトリを再計算するのではなく、リスト全体に2を追加するようです(.) :))
だから基本的には、現在のディレクトリですでに計算されている(ファイル)に値2を追加すると思います。
私が間違っているなら誰でも私を修正できますか?
助けを求めて書いたが、ここで誰もこの質問に答えなかった。忙しいかもしれません。ただし、実験ではファイルが10個あり、数が12個であることを確認すれば十分です。