디렉토리에 있는 파일 수에 대한 *꽤* 형식화된 목록을 만듭니다. 아마도 awk 및 sed일 것입니다.

디렉토리에 있는 파일 수에 대한 *꽤* 형식화된 목록을 만듭니다. 아마도 awk 및 sed일 것입니다.

나는 일련의 디렉토리에 매우 많은 파일을 가지고 있으며아주 좋은 형식각 디렉터리에 몇 개의 파일이 있는지 목록입니다.

디렉터리의 순서는 다음과 같습니다. 상위 디렉터리 이름은 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/001etc.에 포함하려는 콘텐츠가 있는 디렉터리도 포함되어 있으면 **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정렬하려면 앞에 하나를 추가하세요 .

관련 정보