디렉토리의 파일 유형에 대한 재귀 통계?

디렉토리의 파일 유형에 대한 재귀 통계?

전환 프로젝트를 위해 웹사이트 스크래핑을 했습니다. 파일 형식에 대한 통계를 작성하고 싶습니다(예: 400개 .html파일, 100개 .gif파일 등). 이를 수행하는 쉬운 방법이 있습니까? 재귀적이어야 합니다.

편집하다:maxschhelpzig가 게시한 스크립트를 사용하면서 스크랩하던 사이트의 아키텍처로 인해 몇 가지 문제가 발생했습니다. 일부 파일에는 *.php?blah=blah&foo=bar서로 다른 매개변수가 포함된 이름이 있으므로 모두 고유하게 처리됩니다. 따라서 솔루션은 *.php*말하자면 동일한 유형을 모두 고려해야 합니다 .

답변1

이를 위해 findand를 사용할 수 있습니다 . 예를 들면 다음과 같습니다.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 링크를 클릭하세요.

https://github.com/Hoppi164/list_file_extensions

관련 정보