파일 유형별로 파일을 찾는 방법은 무엇입니까?

find를 사용하여 파일을 찾을 수 있다는 것을 알고 있습니다. find . -type f -name "sunrise" . 결과 예 :

./sunrise ./events/sunrise ./astronomy/sunrise ./schedule/sunrise 

또한 파일의 파일 유형을 확인할 수 있다는 것도 알고 있습니다 : file sunrise. 결과 예 :

sunrise: PEM RSA private key 

하지만 파일 형식별로 파일을 찾으려면 어떻게해야합니까?

예 : my-find . -type f -name "sunrise" -filetype=bash-script :

./astronomy/sunrise ./schedule/sunrise 

댓글

  • 옵션은 find 명령이나 파일 유형을 알려주는 기타 항목입니다. 할 수있는 유일한 작업은 --exec file {} \;를 사용한 다음 bash 스크립트 또는 iv id =를 찾는 경우 grep Bourne로 파이프하는 것입니다. “a2958af4ba”>

Perl 스크립트 나 그 라인을 따라 무언가를 찾고 있다면.

답변

Unix 시스템의 “파일 유형”은 일반 파일, 디렉토리, 명명 된 파이프, 문자 특수 파일, 기호 링크 등과 같은 것입니다. find-type 옵션으로 필터링 할 수있는 파일입니다.

find 유틸리티는 “쉘 스크립트”, “JPEG 이미지 파일”또는 기타 일반 파일 유형 을 단독으로 구분할 수 없습니다. 그러나 이러한 유형의 데이터는 file 유틸리티로 구분할 수 있습니다.이 유틸리티는 파일 자체 내의 특정 서명을 조사하여 유형을 결정합니다.

일반적인 레이블 지정 방법 다른 유형의 데이터 파일은 MIME 유형 에 따라 다르며 file는 데이터 파일의 MIME 유형을 결정할 수 있습니다. 파일.


filefind와 함께 사용하여 일반 파일의 MIME 유형을 감지하고이를 사용합니다. 셸 스크립트 만 찾으려면 :

find . -type f -exec sh -c " case $( file -bi "$1" ) in */x-shellscript*) exit 0 esac exit 1" sh {} ";" -print 

또는 bash 사용,

find . -type f \ -exec bash -c "[[ "$( file -bi "$1" )" == */x-shellscript* ]]" bash {} ";" \ -print 

해당 이름을 가진 스크립트 만 감지하려면 -exec 앞에 -name sunrise를 추가하세요.

p>

위의 find 명령은 현재 디렉토리 안이나 아래에있는 모든 일반 파일을 찾고 이러한 각 파일에 대해 짧은 인라인 쉘 스크립트를 호출합니다. 이 스크립트는 발견 된 파일에서 file -bi를 실행하고 해당 명령의 출력에 /x-shellscript 문자열이 포함 된 경우 0 종료 상태로 종료됩니다. 출력에 해당 문자열이 포함되어 있지 않으면 0이 아닌 종료 상태로 종료되어 find가 다음 파일에서 즉시 계속됩니다. 파일이 셸 스크립트 인 것으로 확인되면 find 명령은 파일의 경로 이름 (-print end, 다른 작업으로 대체 될 수도 있습니다.)

file -bi 명령은 파일의 MIME 유형을 출력합니다. Linux의 쉘 스크립트의 경우 ( 및 대부분의 다른 시스템), 이는 file

text/x-shellscript; charset=us-ascii 

와 같습니다. div> 유틸리티 일 수 있습니다.

application/x-shellscript 

일반적인 비트는 /x-shellscript 하위 문자열입니다.

macOS에서는 이유 로 인해 file -bi 대신 file -bI를 사용해야합니다. -i 옵션은 매우 다른 작업을 수행합니다.) macOS의 출력은 Linux 시스템의 출력과 유사합니다.


사용자 지정 작업을 수행 하시겠습니까? 발견 된 각 쉘 스크립트에서 다음을 수행 할 수 있습니다. 위의 find 명령에서 -print 대신 다른 -exec를 사용하지만

find . -type f -exec sh -c " for pathname do case $( file -bi "$pathname" ) in */x-shellscript*) ;; *) continue esac # some code here that acts on "$pathname" done" sh {} + 

또는 bash,

find . -type f -exec bash -c " for pathname do [[ "$( file -bi "$pathname" )" != */x-shellscript* ]] && continue # some code here that acts on "$pathname" done" bash {} + 

관련 항목 :

답변

찾은 모든 파일에서 find를 실행할 수 있습니다. 그런 다음 관심있는 결과에 대해 grep하십시오.

# When looking for ASCII Text find . -type -exec file {} \; | grep "ASCII" # or for MS Word Documents find . -type f -exec file {} \; | grep "Microsoft Word" 

검색 패턴을 가능한 한 귀하의 예상에 가깝게 만드는 것이 좋습니다. 가양 성 일치는 낮습니다.

파일 이름에 줄 바꿈이있는 파일은이 접근 방식에 문제를 일으킬 수 있습니다.

답변

perl“의 File::LibMagic 모듈 사용 :

perl -MFile::LibMagic=:easy -MFile::Find -le " find sub { print $File::Find::name if $_ eq "sunrise" and -f and MagicFile$_ eq "PEM RSA private key" }, @ARGV" -- . 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다