Windows에는 하드 드라이브에 있는 모든 파일의 수를 세는 프로그램이 있는데 출력에는 파일 확장자 목록과 숫자(드라이브에 있는 파일 수(예: jpg) 표시)가 표시됩니다.
gnu+linux의 터미널에서 이 작업을 어떻게 수행합니까?
답변1
find /filesystem -xdev -type f -name '?*.*' -print0 | awk -F. -vRS='\0' '
{c[$NF]++}; END{for (i in c) print c[i],i}' | sort -rn | less
/filesytem
보려는 파일 시스템의 마운트 지점은 어디에 있습니까?
답변2
Unix의 아이디어는 빌딩 블록을 제공하고 이러한 빌딩 블록을 조립하여 이와 같은 특수한 작업을 수행할 수 있도록 하는 것입니다.
이것find
이 명령은 디렉터리 트리를 탐색하여 특정 기준을 충족하는 파일을 나열하거나 작동합니다. 예를 들어 find -xdev /
루트 파일 시스템의 모든 파일을 반복하고 해당 이름을 표시합니다. 이 옵션은 -xdev
네트워크 마운트, 시스템 정보를 제공하는 특수 파일 시스템 등과 같은 다른 파일 시스템의 파일을 무시합니다.
인쇄할 내용을 선택하려면,GNU 찾기공급-printf
행동. 이것%f
지시하다디렉토리 부분 없이 파일 이름을 인쇄합니다.
Linux 파일 이름에는 슬래시(디렉터리 구분 기호)와 null 바이트를 제외한 모든 바이트가 포함될 수 있습니다. 파일 이름에 개행 문자가 포함되어 있지 않다고 가정하면 파일 이름 처리가 더 간단해집니다. 안전을 위해 개행 문자가 포함된 파일 이름을 제외할 수 있습니다.
find / -xdev ! -name $'*\n*' -printf '%f\n'
확장명이 있는 파일을 선택하려면 첫 번째 문자가 아닌 점이 포함된 이름과 일반 파일만 일치시킵니다(심볼릭 링크도 포함할 수도 있고 포함하지 않을 수도 있음).
find / -xdev -name '?*.*' ! -name $'*\n*' -type f -printf '%f\n'
충분한 find
. 확장을 처리하기 위해 쉘을 사용하여 텍스트 처리 도구를 사용합니다.관로그것들을 결합하십시오. 첫 번째sed파일 이름의 비확장자 부분을 제거하기 위해 다시 작성하십시오.
find / -xdev -name '?*.*' ! -name $'*\n*' -type f -printf '%f\n' |
sed 's/.*\.//'
마지막으로, 각 확장의 발생 횟수를 계산하기 위해유형출력 및중복 횟수 계산, 마지막으로 발생 횟수에 따라 결과를 정렬합니다.
find / -xdev -name '?*.*' ! -name $'*\n*' -type f -printf '%f\n' |
sed 's/.*\.//' | sort | uniq -c | sort -n