답변:
file
유틸리티를 사용해보십시오 . 맨 페이지에 따르면 :
매직 테스트는 특정 고정 형식의 데이터가있는 파일을 확인하는 데 사용됩니다. 이에 대한 일반적인 예는 이진 실행 파일 (컴파일 된 프로그램) a.out 파일이며 형식은로 정의되어 있으며 표준 include 디렉토리에 있습니다.
정규식을 가지고 놀아야 할 수도 있지만 다음과 같습니다.
$ find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'
파일에는 많은 옵션이 있으므로 매뉴얼 페이지를 자세히 살펴볼 수 있습니다. 나는 쉽게 잡기 쉬운 출력을 출력하는 것처럼 보이는 첫 번째 옵션을 사용했습니다.
find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print
입니다. 그것은 단지 당신에게 파일을 줄 것입니다 (따라서 그가 실행하고자하는 다음 명령으로 전달 될 수 있습니다)
find
를 설치 한 다음 이와 비슷한 호출을 실행할 수 있습니다.brew install findutils
sudo port install findutils
gfind . -type f -executable -exec file '{}' \; | grep -i execut
스크립트를 제외하는 방법은 다음과 같습니다. 즉 처음 두 문자가있는 파일은 #!
다음 과 같습니다.
find -type f -executable -exec sh -c 'test "$(head -c 2 "$1")" != "#!"' sh {} \; -print
일부 종류의 파일의 경우 바이트 코드 파일과 같이 스크립트 또는 이진으로 분류할지 여부는 명확하지 않습니다. 설정 방법에 따라로 시작하거나 시작하지 않을 수 있습니다 #!
. 이것들이 당신에게 중요하다면, 내부 쉘 스크립트를 더 복잡하게 만들어야합니다. 예를 들어, 다음은 ELF 바이너리 및 모노 실행 파일과 Objective Caml 바이트 코드 프로그램을 포함하는 방법이지만 쉘 스크립트 또는 perl 스크립트 또는 JVM 바이트 코드 프로그램과 같은 다른 종류의 실행 파일은 포함하지 않습니다.
find -type f -executable -exec sh -c '
case "$(head -n 1 "$1")" in
?ELF*) exit 0;;
MZ*) exit 0;;
#!*/ocamlrun*) exit 0;;
esac
exit 1
' sh {} \; -print
find
업데이트 할 권한이없는 하위 레벨 (여전히 RHEL5를 실행하는 많은 과학 클러스터가 있습니다!)이 있는 시스템에서 자신을 발견하는 경우 : 대신
find /mypath/ -executable -type f
위의 훌륭한 답변에서 예를 들어
find /mypath/h -type f -perm -u+x
권한 비트를 검색합니다. 불행히도 위의 내용은 사용자가 실행할 수있는 파일 만 찾지 만 대개는 저에게 효과적입니다.