문제

Linux 컴퓨터에서 나는 것을 통과하는 폴더의 계층 구조의 목록을 얻을 모두의 별개의 파일 확장자니다.

무엇을 할 수있는 가장 좋은 방법이 될 것이 이를 달성하기 위해서니까?

도움이 되었습니까?

해결책

이것을 시도해보십시오 (가장 좋은 방법인지 확실하지 않지만 작동합니다).

find . -type f | perl -ne 'print $1 if m/\.([^.\/]+)$/' | sort -u

다음과 같이 작동합니다.

  • 현재 폴더에서 모든 파일을 찾으십시오
  • 파일 확장을 인쇄합니다
  • 고유 한 정렬 목록을 만드십시오

다른 팁

파이프가 필요하지 않습니다 sort, awk는 모든 것을 할 수 있습니다.

find . -type f | awk -F. '!a[$NF]++{print $NF}'

재귀 버전 :

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

나는 이것을 기반으로한다 이 포럼 게시물, 신용은 거기에 가야합니다.

PowerShell :

dir -recurse | select-object extension -unique

감사합니다 http://kevin-berridge.blogspot.com/2007/11/windows-powershell.html

점으로 모든 것을 찾아 접미사 만 표시하십시오.

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

나의 어색한, sed-less, perl-less, python-ness posix compliant 대안 :

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

빈 확장을 포함하여 매우 큰 디렉토리에 발전기를 사용하는 파이썬에서 각 확장자가 표시되는 횟수를 얻습니다.

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 시간에 앉아있는 regex 코드는 여러 프로그램을 읽기 및 테스트는 이러한 답변이가는 작품이 정확히 같은 제가 원하는 것입니다.

 find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort -u
  • 를 찾는 모든 파일을 수있는 확장자를 가지고.
  • Greps 만 확장
  • Greps 파일 확장자 사이 2 16 자(단지의 숫자를 조정하지 않으면 그들은 당신의 필요에 맞).이를 방지 캐시 파일과 파일 시스템(시스템 파일의 비트를 검색하 감옥).
  • Awk 인쇄 확장 낮은 경우입니다.
  • 정렬하고 가만 독특한 값입니다.원래했을 시도하려고 awk 답지만 그것은 두 항목을 인쇄하는 다양한 경우에는 감성이다.

이 필요한 경우 수의 파일 확장자를 사용하여 다음 아래 코드

find . -type f -name "*.*" | grep -o -E "\.[^\.]+$" | grep -o -E "[[:alpha:]]{2,16}" | awk '{print tolower($0)}' | sort | uniq -c | sort -rn

이러한 방법은 시간이 좀 걸릴 것입을 완료하고 아마 없는 가장 좋은 방법에 대해 이동하는 문제,그들은 작품이다.

업데이트:당@alpha_989 긴 파일 확장자는 원인이 될 것이 문제입니다.그로 인해 원 regex"[[:알파:]]{3,6}".웹사이트에 대한 답을 포함 regex"[[:알파:]]{2,16}".그러나 사람은 이 코드를 사용하여 알고 있어야 하는 사람들의 숫자는 최소 및 최대의 확장을 위해 허용되는 최종 출력됩니다.아무것도 범위 밖으로 분할됩니다에 여러 선이 출력됩니다.

참고:원래 포스팅했 읽"-Greps 파일 확장자 사이의 3 및 6 자(단지의 숫자를 조정하지 않으면 그들은 당신의 필요에 맞).이를 방지 캐시 파일과 파일 시스템(시스템 파일의 비트를 검색하 감옥)."

아이디:을 찾기 위해 사용될 수있 파일 확장자를 통해 특정한 길이를 통해:

 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)"

지금까지 대답은 Newlines가 올바르게 제출 한 필레 명을 다루지 않습니다 (Christophed 's를 제외하고는 내가 이것을 입력 할 때 방금 들어 왔습니다). 다음은 쉘 1 라이너가 아니라 작동하며 합리적으로 빠릅니다.

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

가장 단순하고 간단한 방법은 생각합니다

for f in *.*; do echo "${f##*.}"; done | sort -u

Christophed의 3 번째 방식으로 수정되었습니다.

당신은 또한 이것을 할 수 있습니다

find . -type f -name "*.php" -exec PATHTOAPP {} +
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top