트리의 각 디렉터리에 대한 항목 수를 계산합니다.

트리의 각 디렉터리에 대한 항목 수를 계산합니다.

다음과 같은 트리가 있다고 가정해 보겠습니다.

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

관련 정보