Shell-Script
計算樹中每個目錄的條目
假設我有以下樹:
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 被排除了。
任何有關如何解決此問題的指導將不勝感激。
使用 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])
你可以使用這樣的東西:
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' \;