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


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.