次のツリーがあるとしましょう。
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' \;