디렉토리에서 모든 바이너리 실행 파일을 재귀적으로 찾는 방법은 무엇입니까?

디렉토리에서 모든 바이너리 실행 파일을 재귀적으로 찾는 방법은 무엇입니까?

find다음과 같은 명령을 사용하는 경우 :

find /mydir/mysubdir -executable -type f

모든 실행 파일(디렉토리 제외)을 나열하고 실행 가능한 스크립트 파일(예: script.sh 등)을 포함합니다. 내가 원하는 것은 바이너리 실행 파일을 나열하는 것뿐입니다.

답변1

file유틸리티를 사용해 볼 수 있습니다. 매뉴얼 페이지에 따르면:

매직 테스트는 특정 고정 형식 데이터가 포함된 파일을 확인하는 데 사용됩니다. 일반적인 예로는 바이너리 실행 파일(컴파일러) a.out 파일이 있으며, 그 형식은 표준 포함 디렉터리에 정의되어 있을 수 있습니다.

정규식을 사용해야 할 수도 있지만 다음과 같습니다.

$ find -type f -executable -exec file -i '{}' \; | grep 'x-executable; charset=binary'

파일에는 많은 옵션이 있으므로 매뉴얼 페이지를 자세히 살펴보는 것이 좋습니다. 나는 grep 출력을 쉽게 출력하는 것처럼 보이는 첫 번째 옵션을 사용했습니다.

답변2

스크립트, 즉 처음 두 문자가 다음과 같은 파일을 제외하는 방법은 다음과 같습니다 #!.

find -type f -executable -exec sh -c 'test "$(head -c 2 "$1")" != "#!"' sh {} \; -print

일부 파일 유형의 경우 해당 파일을 스크립트로 분류할지 아니면 바이트코드 파일과 같은 바이너리 파일로 분류할지 명확하지 않습니다. 설정 방법에 따라 로 시작할 수도 있고 시작하지 않을 수도 있습니다 #!. 이것이 중요하다면 내부 쉘 스크립트를 더 복잡하게 만들어야 합니다. 예를 들어 ELF 바이너리, Mono 실행 파일 및 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

답변3

업데이트 권한이 없는 낮은 수준의 시스템을 사용하는 경우를 대비해 find(내가 쓴 대로 RHEL5를 실행하는 과학 클러스터가 여전히 많이 있습니다!) 대신:

find /mypath/ -executable -type f

위의 훌륭한 답변에서 예를 들어 다음과 같이 할 수 있습니다.

find /mypath/h -type f -perm -u+x

권한 비트를 검색합니다. 불행하게도 위의 방법은 사용자가 실행 파일을 가지고 있는 파일만 검색하지만 일반적으로 저에게는 효과적입니다.

답변4

나는 다음과 같은 도구를 작성했습니다., 당신은 이것을 할 수 있습니다.

다른 방법을 사용하면 일부 파일이 손실됩니다.

관련 정보