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
댓글
Perl 스크립트 나 그 라인을 따라 무언가를 찾고 있다면.
답변
Unix 시스템의 “파일 유형”은 일반 파일, 디렉토리, 명명 된 파이프, 문자 특수 파일, 기호 링크 등과 같은 것입니다. find가 -type 옵션으로 필터링 할 수있는 파일입니다.
find 유틸리티는 “쉘 스크립트”, “JPEG 이미지 파일”또는 기타 일반 파일 유형 을 단독으로 구분할 수 없습니다. 그러나 이러한 유형의 데이터는 file 유틸리티로 구분할 수 있습니다.이 유틸리티는 파일 자체 내의 특정 서명을 조사하여 유형을 결정합니다.
일반적인 레이블 지정 방법 다른 유형의 데이터 파일은 MIME 유형 에 따라 다르며 file는 데이터 파일의 MIME 유형을 결정할 수 있습니다. 파일.
file를 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
해당 이름을 가진 스크립트 만 감지하려면 -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" -- .
--exec file {} \;를 사용한 다음 bash 스크립트 또는 iv id =를 찾는 경우grep Bourne로 파이프하는 것입니다. “a2958af4ba”>