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


46

다음 find과 같은 명령을 사용 하면 :

find /mydir/mysubdir -executable -type f

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


1
질문에 대답하는 데 핵심적인 '이진'이라는 단어를 포함하도록 주제를 변경하십시오.
Stefan Lasiewski

답변:


44

file유틸리티를 사용해보십시오 . 맨 페이지에 따르면 :

매직 테스트는 특정 고정 형식의 데이터가있는 파일을 확인하는 데 사용됩니다. 이에 대한 일반적인 예는 이진 실행 파일 (컴파일 된 프로그램) a.out 파일이며 형식은로 정의되어 있으며 표준 include 디렉토리에 있습니다.

정규식을 가지고 놀아야 할 수도 있지만 다음과 같습니다.

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

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


15
나는 use라고 말할 것 find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print입니다. 그것은 단지 당신에게 파일을 줄 것입니다 (따라서 그가 실행하고자하는 다음 명령으로 전달 될 수 있습니다)
Gert

serverfault.com/a/584595/211551 솔루션은 실행 가능으로 표시되지 않았지만 실행 가능한 파일을 찾습니다.
user2067125

OS X에서 or를 사용하여 GNU find를 설치 한 다음 이와 비슷한 호출을 실행할 수 있습니다.brew install findutilssudo port install findutilsgfind . -type f -executable -exec file '{}' \; | grep -i execut
GDP2

7

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

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

2

find업데이트 할 권한이없는 하위 레벨 (여전히 RHEL5를 실행하는 많은 과학 클러스터가 있습니다!)이 있는 시스템에서 자신을 발견하는 경우 : 대신

find /mypath/ -executable -type f

위의 훌륭한 답변에서 예를 들어

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

권한 비트를 검색합니다. 불행히도 위의 내용은 사용자가 실행할 수있는 파일 만 찾지 만 대개는 저에게 효과적입니다.


바이너리뿐만 아니라 실행 가능한 스크립트도 계속 찾을 수 있습니다.
Kusalananda
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.