Tüm ikili çalıştırılabilir dosyaları bir dizinde tekrarlı olarak nasıl bulabilirim?


46

Eğer findböyle bir komut kullanırsam :

find /mydir/mysubdir -executable -type f

Tüm çalıştırılabilir dosyalar listelenir (dizinler hariç) ve çalıştırılabilir komut dosyası dahil (script.sh vb. gibi). Yapmak istediğim sadece ikili çalıştırılabilir dosyaları listelemek.


1
Lütfen konunuzu yanıtlamanın anahtarı olan 'ikili' kelimesini içerecek şekilde değiştirin.
Stefan Lasiewski

Yanıtlar:


44

fileYardımcı programı deneyebilirsiniz . Manpage'e göre:

Sihirli testler, belirli sabit formatlarda veri içeren dosyaları kontrol etmek için kullanılır. Bunun kurallı örneği, biçimli ve muhtemelen standart include dizininde tanımlanmış olan bir ikili çalıştırılabilir (derlenmiş program) a.out dosyasıdır.

Normal ifadeyle oynamak zorunda kalabilirsiniz ama bunun gibi bir şey:

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

dosyada birçok seçenek var, bu yüzden man sayfasına daha yakından bakmak isteyebilirsiniz. Kolayca grep çıktı çıktığını düşündüğüm ilk seçeneği kullandım.


15
Kullanırım derdim find -type f -executable -exec sh -c "file -i '{}' | grep -q 'x-executable; charset=binary'" \; -print. Size sadece dosyalar verecektir (ve böylece çalıştırmak istediği bir sonraki komuta geçirilebilir)
Gert

serverfault.com/a/584595/211551 çözümü, yürütülebilir olarak işaretlenmemiş ancak yürütülebilir dosyaları bulur.
user2067125

OS X'te, GNU'yu veya findile kurabilir ve daha sonra buna benzer bir çağrı yapabilir:brew install findutilssudo port install findutilsgfind . -type f -executable -exec file '{}' \; | grep -i execut
GDP2

7

İşte komut dosyalarını hariç tutmanın bir yolu, yani ilk iki karakteri olan dosyaları #!:

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

Bazı dosya türleri için, örneğin bytecode dosyaları gibi, komut dosyaları mı yoksa ikili dosyalar olarak mı sınıflandırılmasını istediğiniz belli değil. İşlerin nasıl yapıldığına bağlı olarak, bunlar başlayabilir veya başlamaz #!. Bu sizin için önemliyse, iç kabuk betiğini daha karmaşık hale getirmeniz gerekir. Örneğin, ELF ikili dosyalarını ve Mono çalıştırılabilirlerini ve Objective Caml bytecode programlarını nasıl dahil edebileceğinizi ancak kabuk betiği veya perl betiği veya JVM bytecode programı gibi başka türdeki yürütücüleri bulamayabilirsiniz:

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

Kendinizi bir alt seviyeye sahip bir sistemde bulmanız durumunda find(hala yazdığım gibi, RHEL5! 'İ çalıştıran çok sayıda bilim kümesi var) güncelleme hakkı yok: yerine

find /mypath/ -executable -type f

Yukarıdaki mükemmel cevaplarda, örneğin:

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

hangi izin bitlerinde arar. Maalesef yukarıdakiler yalnızca kullanıcının çalıştırılabilir olduğu dosyaları bulur, ancak bu genellikle benim için çalışır.


Bu sadece çalıştırılabilir komut dosyalarını bulabilir, sadece ikili dosyaları bulabilir.
Kusalananda
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.