it-swarm-ko.tech

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

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

find /mydir/mysubdir -executable -type f

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

48
uray

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

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

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

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

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

45
Steven D

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

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

일부 종류의 파일의 경우 바이트 코드 파일과 같이 스크립트 또는 이진으로 분류할지 여부가 명확하지 않습니다. 설정 방법에 따라 #!로 시작하거나 시작하지 않을 수 있습니다. 이것들이 당신에게 중요하다면, 당신은 내부 쉘 스크립트를 더 복잡하게 만들어야합니다. 예를 들어 다음은 ELF 바이너리 및 모노 실행 파일과 Objective Caml 바이트 코드 프로그램을 포함하는 방법이지만 Shell 스크립트 또는 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

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

2
TomRoche