디렉토리에 포함 된 파일의 모든 고유 확장자를 나열하십시오.


11

특정 디렉토리에 포함 된 파일의 모든 고유 한 확장자를보고 싶습니다. bash에서 그렇게하는 명령은 무엇입니까?

하나는 사용할 수 find . -type f다음에 확장자를 제거, 파이프, 현재 디렉토리에있는 모든 파일을 얻을 uniq. 확장을 제거하는 가장 쉬운 방법은 무엇입니까?

답변:


15

이 시도:

find . -type f | sed -rn 's|.*/[^/]+\.([^/.]+)$|\1|p' | sort -u

다음에 대해서는 아무것도 출력하지 않습니다.

  • 확장자가없는 파일
  • 점으로 끝나는 이름을 가진 파일
  • 숨겨진 파일

에 파이프하는 것이 유용 할 수도 있습니다 sort | uniq -c.


내 Mac의 기본 sed에서 작동하지 않습니다. 나는sed: illegal option -- r
dzhelil

8
@celil : OS X -E대신 사용하십시오 -r
.

3
find . -type f | sed -E 's/.+[\./]([^/\.]+)/\1/' | sort -u

확장자가없는 파일을 제외하고 OS X에서 작동합니다. 내 다운로드 폴더 :

DS_Store
dmg
exe
localized
msi
nib
plist
pmproj
rar
tgz
txt
webloc
zip

sed -r대신 필요 할까요?


사소한 문제 : 확장자가없는 파일은 이름을 인쇄합니다. 숨겨진 파일 (예 :)은 .DS_Store선행없이 이름을 인쇄합니다 ..


sort -u대신에 권장 합니다 sort | uniq. 적은 포크 및 리소스 사용.
John T

감사합니다 @John. celil의 "프레임 워크"를 유지하려고했기 때문에 생각하지 않았습니다.
Daniel Beck

안에 점을 이스케이프 할 필요는 없습니다 [].
추후 공지가있을 때까지 일시 중지되었습니다.

3

다음은 포함 된 개행 문자가 포함 된 파일 이름으로 혼동되지 않고 개행 문자가 포함 된 sort -uz파일 확장자를 올바르게 정렬하는 데 사용 되는 또 다른 솔루션입니다 .

# [^.]: exclude dotfiles
find . -type f -name "[^.]*.*" -exec bash -c '
   printf "%s\000" "${@##*.}" # get the extensions and nul-terminate each of them
' argv0 '{}' + |
sort -uz | 
tr '\0' '\n' | 
nl

3

확장명을 제거하는 빠르고 기억하기 쉬운 방법은 모든 파일 이름의 형식이 "name.ext"라고 가정하고 다음을 사용하는 것입니다.

 ls -1 | cut -d"." -f2- | sort | uniq -c

예를 들어 고유 확장이 몇 개인 지 계산합니다.

   1 sh  
   3 txt  
   4 txt.Z  
  17 dat  
  72 dat.gz  

1

그래서 내가 awk를 좋아하는 이유는 다음과 같습니다.

find . -type f | awk -F "." '{ print $(NF) }' | sort -u
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.