나는 일련의 디렉토리에 매우 많은 파일을 가지고 있으며아주 좋은 형식각 디렉터리에 몇 개의 파일이 있는지 목록입니다.
디렉터리의 순서는 다음과 같습니다. 상위 디렉터리 이름은 A, B, ... H, I입니다. 각 디렉터리 아래에는 001, 002,...007이라는 이름의 디렉터리가 1~7개 있습니다. 이 디렉토리의 파일 수를 알고 싶습니다.
내가 원하는 것은 이것이다:
... C/003 122 C/004 45 C/005462 D/001 215 E/001 98 E/002 323 ...
디렉토리 이름과 개수 사이의 탭을 생각하고 있습니다. 개수가 왼쪽 정렬인지 오른쪽 정렬인지는 중요하지 않습니다.
내가 직접 하는 일은 기본적으로 다음과 같습니다.
(나를 위한*/* 하다 에코 >>> $i" ls "$i" | 완료) > 파일 개수
결과는 다음과 같습니다.
... >>> F/002 30 30 234 >>> F/003 120 120 1322 >>>G/001 78 78 620 ...
분명히 나쁘지 않은 것 같습니다. ">>>"를 교체 wc
하고 wc -l
제거하면 훨씬 더 좋습니다.와는 별개로각 "레코드"에는 한 줄이 아닌 두 줄 이상이 있습니다.
그래서 나에게 필요한 것은 일부 awk
또는 sed
(또는어느- 이 두 전선보다 두 전선을 연결하는 더 쉬운 도구가 있습니까? ) 두 개의 선과 두 개의 선을 하나의 선으로 연결하는 마법.
그러나 보다 직접적인 방법(셸 스크립트, Perl, Python, 일부정말 어둡다sed 및 awk 매직) 목록을 "한 번에" 만드는 것이 더 좋을 것입니다...
답변1
파일 이름에 개행 문자가 포함되어 있지 않고 grep
-o 옵션을 지원한다고 가정합니다.
find [[:upper:]] -type f | grep -Eo '^./[0-9]{3}' | sort | uniq -c
답변2
각 디렉터리에 대해 개별적으로 파일 배열을 만들고 요소 수를 계산할 수 있습니다. 그건 bash
이렇겠지
for dir in */*/; do a=( "$dir"/* ); printf "%s\t%s\n" "$dir:" "${#a[@]}"; done
A/001
etc.에 포함하려는 콘텐츠가 있는 디렉터리도 포함되어 있으면 **
glob을 추가하세요.
shopt -s globstar
for dir in */*/; do a=( "$dir"/**/* ); printf "%s\t%s\n" "$dir:" "${#a[@]}"; done
답변3
원하는 것을 얻는 가장 쉬운 방법은 디렉토리 이름을 인쇄할 때 옵션을 사용하는 것입니다 -n
. echo
이렇게 하면 에코한 내용 끝에 개행 문자가 인쇄되는 것을 방지하여 다음 출력이 같은 줄에 유지됩니다. 필요한 정보를 수집하고 출력을 제공하기 전에 여러 변환을 실행하려는 경우 다른 언어를 선택하는 것이 더 나을 수 있습니다.
답변4
어쩌면 다음과 같은 것일 수도 있습니다.
find $PWD/ -type f -printf "%h\n\0" | uniq -zc
다음과 같은 것을 생성합니다.
7 /foo
17 /foo/bar
9 /foo/baz
| sort -z
| uniq
정렬하려면 앞에 하나를 추가하세요 .