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”>