디렉토리의 각 확장자에 대한 파일 수와 확장자가없는 파일 수를 계산하고 싶습니다.
몇 가지 옵션을 시도했지만 아직 해결 방법을 찾지 못했습니다.
-
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