답변:
이것을 시도하십시오 (최상의 방법인지 확실하지 않지만 작동합니다).
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
다음과 같이 작동합니다.
git ls-tree -r HEAD --name-only
find
find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort | uniq -c | sort -n
파이프가 필요 sort
하지 않습니다. awk는 모든 것을 할 수 있습니다.
find . -type f | awk -F. '!a[$NF]++{print $NF}'
alias
명령에 대한 따옴표로 묶으려고 하지만 명령 자체가 이미 find 명령에서 따옴표를 사용한다는 것입니다. 이 문제를 해결하기 위해 다음 bash
과 같이 리터럴 문자열 구문을 사용합니다.alias file_ext=$'find . -type f -name "*.*" | awk -F. \'!a[$NF]++{print $NF}\''
maindir/test.dir/myfile
-printf "%f\n"
'find'명령 끝에 추가 하고 테스트를 다시 실행하십시오.
재귀 버전 :
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
총계를 원할 경우 (확장자가 몇 번이나 보 였는지) :
find . -type f | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort | uniq -c | sort -rn
비 재귀 (단일 폴더) :
for f in *.*; do printf "%s\n" "${f##*.}"; done | sort -u
나는 이 포럼 게시물을 기반으로 , 신용은 거기에 가야합니다.
git show --name-only --pretty="" | sed -e 's/.*\.//' | sed -e 's/.*\///' | sort -u
파워 쉘 :
dir -recurse | select-object extension -unique
http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html 덕분에
.
합니다 (예 : 출력 jquery-1.3.4
과 같이 .4
표시됨). dir -file -recurse | select-object extension -unique
파일 확장자 만 얻으려면로 변경하십시오 .
나의 awk-less, sed-less, Perl-less, Python-less POSIX 호환 대안 :
find . -type f | rev | cut -d. -f1 | rev | tr '[:upper:]' '[:lower:]' | sort | uniq --count | sort -rn
요령은 선을 뒤집고 처음에 확장을 자르는 것입니다.
또한 확장명을 소문자로 변환합니다.
출력 예 :
3689 jpg
1036 png
610 mp4
90 webm
90 mkv
57 mov
12 avi
10 txt
3 zip
2 ogv
1 xcf
1 trashinfo
1 sh
1 m4v
1 jpeg
1 ini
1 gqv
1 gcs
1 dv
uniq
full 플래그 --count
가 없지만 제대로 -c
작동합니다
점이있는 모든 것을 찾고 접미사 만 표시하십시오.
find . -type f -name "*.*" | awk -F. '{print $NF}' | sort -u
모든 접미사에 3자가 있다는 것을 알고 있다면
find . -type f -name "*.???" | awk -F. '{print $NF}' | sort -u
또는 sed는 1 ~ 4 자의 모든 접미사를 표시합니다. {1,4}를 접미사에서 예상되는 문자 범위로 변경하십시오.
find . -type f | sed -n 's/.*\.\(.\{1,4\}\)$/\1/p'| sort -u
믹스에 내 변형을 추가합니다. 나는 그것이 가장 단순하고 효율성이 큰 관심사가 아닐 때 유용 할 수 있다고 생각합니다.
find . -type f | grep -o -E '\.[^\.]+$' | sort -u
$ find . -type f | grep -o -E '\.[^.\/]+$' | sort -u
파이썬에서는 공백 확장을 포함하여 매우 큰 디렉토리에 생성기를 사용하고 각 확장이 표시되는 횟수를 얻습니다.
import json
import collections
import itertools
import os
root = '/home/andres'
files = itertools.chain.from_iterable((
files for _,_,files in os.walk(root)
))
counter = collections.Counter(
(os.path.splitext(file_)[1] for file_ in files)
)
print json.dumps(counter, indent=2)
나는 여기에 많은 답변을 시도했다. 심지어 "최고의"답변까지. 그들은 모두 내가 구체적으로 추구했던 것보다 부족했습니다. 그래서 지난 12 시간 동안 여러 프로그램에 대한 정규식 코드에 앉아 이러한 답변을 읽고 테스트하는 것 외에도 이것이 내가 원하는 것처럼 정확하게 작동했습니다.
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
파일 확장자가 필요한 경우 아래 코드를 사용하십시오.
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn
이러한 방법을 완료하는 데 시간이 걸리고 문제를 해결하는 가장 좋은 방법은 아니지만 작동합니다.
업데이트 : @ alpha_989 당 긴 파일 확장자는 문제를 일으킬 것입니다. 원래 정규식 "[[: alpha :]] {3,6}"때문입니다. 정규식 "[[: alpha :]] {2,16}"을 포함하도록 답변을 업데이트했습니다. 그러나이 코드를 사용하는 사람은 해당 숫자가 확장이 최종 출력에 허용되는 시간의 최소값과 최대 값이라는 것을 알고 있어야합니다. 이 범위를 벗어나는 것은 출력에서 여러 줄로 나뉩니다.
참고 : 원래 게시물은 "-3 ~ 6 자 사이의 파일 확장자에 대한 Greps (필요에 맞지 않으면 숫자를 조정하십시오)를 읽었습니다. 이는 캐시 파일 및 시스템 파일을 피하는 데 도움이됩니다 (시스템 파일 비트는 감옥을 찾는 것입니다). "
아이디어 : 다음을 통해 특정 길이의 파일 확장자를 찾는 데 사용할 수 있습니다.
find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{4,}" | awk '{print tolower($0)}' | sort -u
여기서 4는 포함 할 파일 확장자 길이이며 해당 길이 이상의 확장자를 찾습니다.
Perl을 사용하는 다른 솔루션이 이미 있으므로 :
파이썬을 설치했다면 쉘에서 할 수도 있습니다.
python -c "import os;e=set();[[e.add(os.path.splitext(f)[-1]) for f in fn]for _,_,fn in os.walk('/home')];print '\n'.join(e)"
지금까지 답글은 개행 문자가있는 파일 이름을 올바르게 처리하지 못했습니다 (ChristopheD는 제외하고 입력했습니다). 다음은 쉘 한 줄짜리가 아니지만 작동하며 합리적으로 빠릅니다.
import os, sys
def names(roots):
for root in roots:
for a, b, basenames in os.walk(root):
for basename in basenames:
yield basename
sufs = set(os.path.splitext(x)[1] for x in names(sys.argv[1:]))
for suf in sufs:
if suf:
print suf
나는 이것이 아직 언급되지 않았다고 생각한다.
find . -type f -exec sh -c 'echo "${0##*.}"' {} \; | sort | uniq -c
허용 된 답변은 REGEX를 사용하며 REGEX로 별칭 명령을 만들 수 없으며 쉘 스크립트에 넣어야합니다 .Amazon Linux 2를 사용하고 있으며 다음을 수행했습니다.
다음을 사용하여 허용되는 응답 코드를 파일에 넣습니다.
sudo vim find.sh
이 코드를 추가하십시오 :
find ./ -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
다음을 입력하여 파일을 저장하십시오. :wq!
sudo vim ~/.bash_profile
alias getext=". /path/to/your/find.sh"
:wq!
. ~/.bash_profile
.svn
), 사용find . -type f -path '*/.svn*' -prune -o -print | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u
소스