Jeśli użyję find
polecenia 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.
Jeśli użyję find
polecenia 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.
Odpowiedzi:
Możesz wypróbować file
narzę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.
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ć)
find
z brew install findutils
lub, sudo port install findutils
a następnie możesz uruchomić takie wywołanie z podobnym skutkiem:gfind . -type f -executable -exec file '{}' \; | grep -i execut
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
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.