Shell-Script

計算樹中每個目錄的條目

  • November 11, 2013

假設我有以下樹:

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' \;

引用自:https://unix.stackexchange.com/questions/99578