디렉토리에서 각 확장자의 파일 수 찾기


10

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

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

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

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

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

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

답변:


10
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 반복 된 항목 수를 센다.

9

파이썬 사용하기 :

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})

같은 당신은 아마, 지능형리스트와 함께 멀리 얻을 수 ext = [ f.split('.')[-1] for f in os.listdir('./') ] Thatll가 몇 라인이 짧고 아마도 더 파이썬 만들기
세르지 Kolodyazhnyy

제안 주셔서 감사합니다, 나는 단지 내가 할 수있는 한 명확하게 작성하려고했습니다 ...
Ravexina

1
명확성은 미덕입니다 :) 특히 코드 및 엔지니어링 문서와 관련하여.
Sergiy Kolodyazhnyy

6

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}'

5

기본 /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

files_tb내가 참조하고 있다고 생각하지만 테이블 열은 내가 볼 수있는 곳에서 정의되지 않았습니다?
WinEunuuchs2Unix

@ WinEunuuchs2Unix csv 파일 자체에 정의되어 있습니다. 그것이 첫 번째 일 printf입니다. 그리고 SQLite는 csv 파일의 첫 줄을 열 이름으로 취급하도록 기본 설정됩니다.
Sergiy Kolodyazhnyy

1
매우 인상적! +1
WinEunuuchs2Unix

5

옵션 인 경우 PowerShell 사용 :

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

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

ls -file | group -n Extension

1
와! 훌륭한 첫 번째 답변! Linux 용 PowerShell이 ​​존재하는지도 몰랐습니다 ... +1
Fabby

2
감사. 크로스 플랫폼과 오픈 소스는 한동안 존재했지만 SO와 SU에는 Windows의 쉘 스크립팅에 대한 질문에 "cygwin을 설치하고 bash를 사용하여 자주 응답하는 패턴이 있습니다. 다음과 같이 할 수 있습니다. ", Windows에서 시작된 도구를 사용하여 Linux SE 사이트에서 동일한 작업을 수행하는 것을 주저했습니다. 그러나 이것은 장황함에 대한 오래된 주장을 초대하지 않고 PowerShell의 강점을 아주 훌륭하게 보여주는 훌륭한 작업이었습니다.
Joey
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.