ツリー内の各ディレクトリの項目数を計算します。

ツリー内の各ディレクトリの項目数を計算します。

次のツリーがあるとしましょう。

root:
d foo 
d bar

/foo:
d A
- tmp.txt

/bar:
d B
- tmp2.txt

/foo/A:
- tmp3.txt

/bar/B:

d = ディレクトリ、 - = ファイル

次の質問に答える必要があります。ルートディレクトリ以外のディレクトリのうち、最も少ないエントリを含むディレクトリは何ですか?

頑張りました

  find . | grep -oE '/([a-zA-Z]+/)+'

各ディレクトリの発生回数を取得します。問題は、このコマンドが空のディレクトリを除外することです。この場合、/bar/B は除外されます。

この問題を解決する方法についての指示をいただきありがとうございます。

答え1

GNUツールの使用:

find . -printf '%h\0' -type d ! -name . -print0 |
  sort -z |
  uniq -zc |
  sort -zn |
  sed -z q |
  tr '\0' '\n'

ファイル名に改行文字が含まれていないことを保証できる場合は、次のように単純化できます。

find . -printf '%h\n' -type d ! -name . -print | sort | uniq -c | sort -n | head -n1

(報告された数字は、ディレクトリ内のファイル数から1を引いたものです(.計算されますが計算されません..)。

そしてzsh

count() {
  set -- $REPLY/*(NDoN)
  REPLY=$#
}
print -r -- **/*(Do+count[1])

答え2

次のように使用できます。

find . -type d -exec sh -c \
    'printf -- "%-20s: " {};
    find {} -maxdepth 1 -type f -printf "%i\n" | wc -l' \;

次のツリーがある場合(tree良いコマンドです):

$ tree -a .
.
├── bar
│   ├── B
│   └── tmp2.txt
├── ff
├── .ff.swp
└── foo
    ├── A
    │   └── tmp3.txt
    ├── f2.txt
    ├── f3.txt
    └── tmp.txt

あなたはこれを得ます:

.                   : 2
./foo               : 3
./foo/A             : 1
./bar               : 1
./bar/B             : 0

リスト小さいものの一つ(より多くの人がたとえば空のファイルを持つことができます。)次のことができます。

find . -type d -exec sh -c \
    'find "{}" -maxdepth 1 -type f -printf "%i\n" | \
    wc -l | xargs printf "%-2d";
    printf ": %s\n" "{}" ' \; | sort -k1,1 | head -n 1

フォルダに改行文字が含まれていない場合。


利用できない場合、-maxdepth代替は次のとおりです。

find . -type d -exec sh -c \
    'printf -- "%-20s: " "{}";
    find "{}" ! -wholename "{}" -prune -type f -printf "%i\n" | wc -l' \;

関連情報