디렉토리에서 각 확장자의 파일 수 찾기 | sort | uniq -c옵션이지만

디렉토리의 각 확장자에 대한 파일 수와 확장자가없는 파일 수를 계산하고 싶습니다.

몇 가지 옵션을 시도했지만 아직 해결 방법을 찾지 못했습니다.

  • find "$folder" -type f | sed 's/.*\.//' | sort | uniq -c옵션이지만 파일 확장자가 없으면 작동하지 않습니다. 확장자가없는 파일 수를 알아야합니다.

  • 또한 찾기 루프를 배열로 시도한 다음 결과를 합산했지만 현재 해당 코드는 선언되지 않은 변수 오류를 발생하지만 루프 외부에서만 발생합니다.

    declare -a arr
    arr=()
    echo ${arr[@]}
    

    find 루프가 완료되면 선언되지 않은 변수가 발생합니다.



답변

find "$path" -type f | sed -e '/.*\/[^\/]*\.[^\/]*$/!s/.*/(none)/' -e 's/.*\.//' | LC_COLLATE=C sort | uniq -c

설명:

  • find "$path" -type f "$path"폴더 에있는 모든 파일의 재귀 목록을 가져옵니다 .
  • sed -e '/.*\/[^\/]*\.[^\/]*$/!s/.*/(none)/' -e 's/.*\.//' 정규식 :
    • /.*\/[^\/]*\.[^\/]*$/!s/.*/(none)/ 확장자가없는 모든 파일을 (없음)으로 바꿉니다.
    • s/.*\.// 나머지 파일의 확장자를 얻으십시오.
  • LC_COLLATE=C sort 기호를 맨 위에 유지하면서 결과를 정렬하십시오.
  • uniq -c 반복 된 항목 수를 센다.

답변

파이썬 사용하기 :

import os
from collections import Counter
from pprint import pprint

lst = []
for file in os.listdir('./'):
        name, ext = os.path.splitext(file)
        lst.append(ext)

pprint(Counter(lst))

출력 :

Counter({'': 7,
         '.png': 4,
         '.mp3': 3,
         '.jpg': 3,
         '.mkv': 3,
         '.py': 1,
         '.swp': 1,
         '.sh': 1})

답변

GNU awk가 있다면 다음과 같은 일을 할 수 있습니다

printf '%s\0' * | gawk 'BEGIN{RS="\0"; FS="."; OFS="\t"}
  {a[(NF>1 ? $NF : "(none)")]++}
  END{for(i in a) print a[i],i}
'

즉, 마지막으로 .분리 된 필드 에 키가있는 연관 배열 또는 (none)확장이없는 경우 와 같은 임의의 고정 문자열을 생성 / 증가합니다 .

mawk널 바이트 레코드 구분 기호를 허용하지 않는 것 같습니다 mawk. 파일 이름에서 줄 바꿈을 처리 할 필요가없는 경우 기본 줄 바꿈 구분 기호를 사용할 수 있습니다 .

printf '%s\n' * | mawk 'BEGIN{FS="."; OFS="\t"} {a[(NF>1 ? $NF : "(none)")]++} END{for(i in a) print a[i],i}'

답변

기본 /bin/sh또는 심지어 bash작업이 조금 어려울 수 있지만 다른 답변에서 볼 수 있듯이 집계 데이터에서 작동 할 수있는 도구는 이러한 작업을 특히 쉽게 처리 할 수 ​​있습니다. 그러한 도구 중 하나는 sqlite데이터베이스입니다.

sqlite데이터베이스 를 사용하는 매우 간단한 프로세스 는 .csv파일 이름과 확장자라는 두 개의 필드 로 파일 을 작성하는 것 입니다. 나중에 sqlite간단한 집계 문 COUNT()을 사용 GROUP BY ext하여 확장명 필드를 기반으로 파일 계산을 수행 할 수 있습니다.

$ { printf "file,ext\n"; find -type f -exec sh -c 'f=${1##*/};printf "%s,%s\n" "${1}" "${1##*.}"' sh {} \; ; }  > files.csv
$ sqlite3 <<EOF
> .mode csv
> .import ./files.csv files_tb
> SELECT ext,COUNT(file) FROM files_tb GROUP BY ext;
> EOF
csv,1
mp3,6
txt,1
wav,27

답변

옵션 인 경우 PowerShell 사용 :

Get-ChildItem -File | Group-Object Extension -NoElement

또는 별명을 사용하여 더 짧게 :

ls -file | group -n Extension