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


9

내가 사용하여 파일을 찾을 수 있습니다 알고 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

1
--filetypefind 명령 또는 파일 유형을 알려주는 다른 옵션 은 없습니다 . bash 스크립트를 찾거나 Perl 스크립트 또는 그 줄을 따라 무언가를 찾고 있다면 사용 --exec file {} \;하고 파이프로 연결하십시오. grep Bournegrep Perl
Nasir Riley

답변:


13

유닉스 시스템에서 "파일 형식"은 일반 파일, 디렉토리, 명명 된 파이프, 문자 특수 파일, 심볼릭 링크 등 입니다. 옵션으로 find필터링 할 수 있는 파일 형식입니다 -type.

find유틸리티는 "쉘 스크립트", "JPEG 이미지 파일"또는 다른 유형의 일반 파일 을 자체적으로 구별 할 수 없습니다 . 그러나 이러한 유형의 데이터는 file파일 자체 내에서 특정 서명을 확인하여 유형을 결정 하는 유틸리티 로 구별 될 수 있습니다 .

데이터 파일의 서로 다른 유형의 레이블을하는 일반적인 방법은 것입니다 MIME 타입file파일의 MIME 타입을 결정할 수있다.


filewith find를 사용 하여 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

해당 이름의 스크립트 만 감지하려면 -name sunrise앞에 추가하십시오 -exec.

find위 의 명령은 현재 디렉토리 내에서 또는 아래에서 모든 일반 파일을 찾을 수 있으며 이러한 각 파일에 대해 짧은 인라인 쉘 스크립트를 호출합니다. 이 스크립트는 file -bi찾은 파일에서 실행되며 해당 명령의 출력에 문자열이 포함되어 있으면 종료 상태없이 종료됩니다 /x-shellscript. 출력에 해당 문자열이 없으면 0이 아닌 종료 상태로 종료 find되어 다음 파일로 즉시 계속됩니다. 파일이 쉘 스크립트 인 것으로 발견되면 find명령은 파일의 경로 이름 ( -print끝 부분에 다른 조치로 대체 될 수 있음)을 출력합니다.

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

text/x-shellscript; charset=us-ascii

약간 오래된 file유틸리티 버전이있는 시스템에서는

application/x-shellscript

공통 비트는 /x-shellscript부분 문자열입니다.

맥 OS에서 사용해야합니다 file -bI대신 file -bi때문에 이유 합니다 ( -i옵션은 상당히 다른 무언가를). macOS의 출력은 Linux 시스템의 출력과 유사합니다.


찾은 각 쉘 스크립트에 대해 사용자 정의 조치를 수행하고 싶습니까? 위 의 명령 -exec대신 다른 스크립트를 사용하여 수행 할 수도 있지만 수행 할 수도 있습니다-printfind

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 {} +

관련 :


1

당신은 간부 인 수있는 find모든 FOUND 파일에 다음 관심있는 결과를 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"

가양 성 일치 수를 낮게 유지하기 위해 검색 패턴을 가능한 한 가깝게 만드는 것이 좋습니다.

파일 이름에 줄 바꿈이있는 파일은이 방법에 문제가 발생할 수 있습니다.


0

사용 perlFile::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' -- .
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.