다음과 같은 트리가 있다고 가정해 보겠습니다.
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' \;