![디렉토리의 파일 유형에 대한 재귀 통계?](https://linux55.com/image/17273/%EB%94%94%EB%A0%89%ED%86%A0%EB%A6%AC%EC%9D%98%20%ED%8C%8C%EC%9D%BC%20%EC%9C%A0%ED%98%95%EC%97%90%20%EB%8C%80%ED%95%9C%20%EC%9E%AC%EA%B7%80%20%ED%86%B5%EA%B3%84%3F.png)
전환 프로젝트를 위해 웹사이트 스크래핑을 했습니다. 파일 형식에 대한 통계를 작성하고 싶습니다(예: 400개 .html
파일, 100개 .gif
파일 등). 이를 수행하는 쉬운 방법이 있습니까? 재귀적이어야 합니다.
편집하다:maxschhelpzig가 게시한 스크립트를 사용하면서 스크랩하던 사이트의 아키텍처로 인해 몇 가지 문제가 발생했습니다. 일부 파일에는 *.php?blah=blah&foo=bar
서로 다른 매개변수가 포함된 이름이 있으므로 모두 고유하게 처리됩니다. 따라서 솔루션은 *.php*
말하자면 동일한 유형을 모두 고려해야 합니다 .
답변1
이를 위해 find
and를 사용할 수 있습니다 . 예를 들면 다음과 같습니다.uniq
$ find . -type f | sed 's/.*\.//' | sort | uniq -c
16 avi
29 jpg
136 mp3
3 mp4
명령어 설명
find
모든 파일 이름을 재귀적으로 인쇄sed
각 파일 이름에서 파일 확장자까지 접두사를 제거합니다.uniq
입력이 정렬되었다고 가정합니다.-c
(히스토그램과 같이) 숫자를 세어보세요.
답변2
이 한 줄짜리 접근 방식은 매우 강력한 접근 방식인 것 같습니다.
find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c
find . -type f -printf '%f\n'
디렉터리 없이 트리에 있는 각 일반 파일의 기본 이름을 인쇄합니다 . 이렇게 하면 정규 표현식 .
에 포함될 수 있는 디렉토리 에 대해 걱정할 필요가 없습니다 sed
.
sed -r -n 's/.+(\..*)$/\1/p'
수신 파일 이름을 해당 확장자로만 바꿉니다. 예를 들어 정규식의 첫 번째 문자에 유의하세요. 이렇게 하면 일치 항목에 확장자 앞에 문자가 하나 이상 .somefile.ext
필요 .ext
합니다 . 이렇게 하면 파일 이름이 전혀 이름이 없고 확장자 ".gitignore"(아마도 원하는 것일 수 있음)가 없는 것으로 처리되는 것을 방지할 수 있습니다. 그렇지 않은 경우 로 교체하십시오 ..+
.
.gitignore
.+
.*
나머지 줄은 허용된 답변에서 나옵니다.
편집하다: 잘 정렬된 히스토그램을 원하는 경우파레토 차트형식을 지정하려면 sort
끝에 다른 형식을 추가하세요.
find . -type f -printf '%f\n' | sed -r -n 's/.+(\..*)$/\1/p' | sort | uniq -c | sort -bn
빌드된 Linux 소스 트리의 출력 예:
1 .1992-1997
1 .1994-2004
1 .1995-2002
1 .1996-2002
1 .ac
1 .act2000
1 .AddingFirmware
1 .AdvancedTopics
[...]
1445 .S
2826 .o
2919 .cmd
3531 .txt
19290 .h
23480 .c
답변3
zsh1 사용:
print -rl -- **/?*.*(D.:e) | uniq -c |sort -n
이것무늬 **/?*.*
현재 디렉터리와 하위 디렉터리의 확장자를 가진 모든 파일을 재귀적으로 일치시킵니다. 이것D
글로벌 예선zsh
숨겨진 디렉터리를 탐색하고 숨겨진 파일도 고려하여 .
일반 파일만 선택해 보겠습니다 . 이것:e
수정자파일 확장자만 유지됩니다. print -rl
한 줄에 하나의 일치 항목을 인쇄합니다. uniq -c
연속된 동일한 항목 수를 계산합니다(전체 결과는 이미 정렬되어 있음). 마지막 호출은 sort
사용 횟수를 기준으로 확장 프로그램을 정렬합니다.
¹ 그리고 파일 확장자에 개행 문자가 포함되어 있지 않다고 가정합니다.
답변4
이 스레드는 오래되었지만 "bash 계산 파일 확장자"를 검색할 때 가장 높은 결과 중 하나입니다.
나는 당신과 같은 문제가 있었고 maxschlepzig와 유사한 스크립트를 만들었습니다.
다음은 작업 디렉터리에 있는 모든 파일의 확장자를 재귀적으로 계산하는 명령입니다. 이는 UPPER 및 LOWER 사례를 고려하여 병합하고 위양성 결과를 제거하고 발생 횟수를 계산합니다.
find . -type f \
| tr '[:upper:]' '[:lower:]' \
| grep -E ".*\.[a-zA-Z0-9]*$" \
| sed -e 's/.*\(\.[a-zA-Z0-9]*\)$/\1/' \
| sort |
| uniq -c \
| sort -n
더 많은 문서를 보려면 github 링크를 클릭하세요.