Jak znaleźć rekurencyjnie wszystkie binarne pliki wykonywalne w katalogu?


46

Jeśli użyję findpolecenia w ten sposób:

find /mydir/mysubdir -executable -type f

wszystkie pliki wykonywalne są wymienione (oprócz katalogów), w tym plik wykonywalny (jak skrypt.sh itp.). Chcę tylko wyświetlić pliki binarne.


1
Zmień temat, tak aby zawierał słowo „binarne”, które jest kluczem do udzielenia odpowiedzi na pytanie.
Stefan Lasiewski

Odpowiedzi:


44

Możesz wypróbować filenarzędzie. Według strony podręcznika:

Magiczne testy służą do sprawdzania plików z danymi w określonych stałych formatach. Kanonicznym przykładem tego jest binarny plik wykonywalny (skompilowany program) a.out, którego format jest zdefiniowany i ewentualnie w standardowym katalogu dołączania.

Być może będziesz musiał bawić się wyrażeniem regularnym, ale coś takiego:

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

plik ma wiele opcji, więc możesz przyjrzeć się bliżej stronie man. Użyłem pierwszej znalezionej opcji, która wydawała się dawać wynik łatwy do grepa.


15
Powiedziałbym użyć find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print. Da ci tylko pliki (a zatem może zostać przekazany do następnego polecenia, które chce uruchomić)
Gert

Rozwiązanie serverfault.com/a/584595/211551 znajduje pliki, które NIE są oznaczone jako pliki wykonywalne, ale są pliki wykonywalne.
user2067125,

W systemie OS X możesz zainstalować GNU findz brew install findutilslub, sudo port install findutilsa następnie możesz uruchomić takie wywołanie z podobnym skutkiem:gfind . -type f -executable -exec file '{}' \; | grep -i execut
GDP2

7

Oto sposób na wykluczenie skryptów, tj. Plików, których pierwsze dwa znaki to #!:

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

W przypadku niektórych rodzajów plików nie jest jasne, czy mają być klasyfikowane jako skrypty, czy binarne, na przykład pliki kodu bajtowego. W zależności od konfiguracji rzeczy mogą, ale nie muszą zaczynać #!. Jeśli mają one dla Ciebie znaczenie, będziesz musiał skomplikować skrypt wewnętrznej powłoki. Na przykład, oto, w jaki sposób możesz dołączyć pliki binarne ELF i pliki wykonywalne Mono oraz programy kodu bajtowego Objective Caml, ale nie inne rodzaje plików wykonywalnych, takie jak skrypty powłoki lub skrypty perl lub programy bajtowe 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

Na wypadek, gdybyś znalazł się w systemie z niższym poziomem find(wciąż, jak piszę, istnieje wiele klastrów naukowych z systemem RHEL5!) Bez uprawnień do aktualizacji: zamiast

find /mypath/ -executable -type f

w powyższych doskonałych odpowiedziach możesz zrobić np.

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

który wyszukuje bity uprawnień. Niestety powyższe znajduje tylko pliki, dla których użytkownik ma plik wykonywalny, ale to zwykle działa dla mnie.


W dalszym ciągu znajdowałyby się skrypty wykonywalne, nie tylko binaria.
Kusalananda
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.