Temukan semua file yang dapat dieksekusi dalam folder di terminal

19

Saya memiliki folder myfolderyang berisi hierarki besar file / folder.
Bagaimana menemukan semua file yang dapat dieksekusi dalam folder ini?

Di Ubuntu ini berfungsi: find . -executable -type f

Tetapi Mac OS X Mavericks (yang juga menggunakan bash) gagal mendapatkannya:

find: -executable: unknown primary or operator
Nicolas Raoul
sumber

Jawaban:

29

Ini akan menemukan semua file (bukan symlink) dengan set bit yang dapat dieksekusi:

find . -perm +111 -type f

Ini juga akan menemukan symlink (yang seringkali sama pentingnya)

find . -perm +111 -type f -or -type l

Inilah cara kerja perintah jika tidak jelas:

  • find jelas merupakan program find (:
  • .merujuk ke direktori untuk mulai mencari di ( .= direktori saat ini)
  • -perm +111= dengan set bit yang dapat dieksekusi ( +berarti "semua bit ini", 111adalah oktal untuk bit yang dapat dieksekusi pada pemilik, grup, dan siapa saja)
  • -type fberarti jenisnya adalah file
  • -or boolean ATAU
  • -type lberarti jenisnya adalah tautan simbolik
drfrogsplat
sumber
2
Anda dapat menggunakan -Lalih-alih -or -type lmenyebabkan statpanggilan apa pun yang dilakukan finduntuk mengembalikan statistik file yang ditautkan, bukan tautan itu sendiri.
Ian C.
Masalah yang saya temukan dengan pendekatan ini adalah bahwa file apa pun dapat memiliki izin jalankan. Misalnya, setelah Anda mengunduh beberapa file teks dari Windows, izinnya kacau.
Ivan Z. Xiao
5

Saya tidak bisa membuat jawaban Ian berhasil (10.6.8), tetapi, berikut ini memberikan hasil yang diharapkan:

find . -type f -perm +0111 -print

edit pembaruan

Ini sepertinya berhasil juga!

find . -type f -perm +ugo+x -print

Saya kira "x" tidak ada artinya tanpa pengguna / grup / penentu lain.

Kent
sumber
Sintaksis simbolik haruslah baru - terima kasih telah menunjukkannya. Saya memperbarui jawaban saya sehingga menggunakan oktal dan kompatibel dengan versi OS X yang lebih lama.
Ian C.
Anehnya, bagian dari halaman 10.6 itu persis sama dengan apa yang Anda kutip .... yang cukup membuat saya menggali lebih dalam dan melihat apa yang sedang terjadi. Mengubah tanggapan saya di atas.
Kent
2
Kesimpulan: Sintaks perintah BDS aneh.
Ian C.
3

Dari halaman manual untuk menemukan di OS X :

 -perm [-|+]mode
         The mode may be either symbolic (see chmod(1)) or an octal number.  If the mode is symbolic, a
         starting value of zero is assumed and the mode sets or clears permissions without regard to the
         process' file mode creation mask.  If the mode is octal, only bits 07777 (S_ISUID | S_ISGID |
         S_ISTXT | S_IRWXU | S_IRWXG | S_IRWXO) of the file's mode bits participate in the comparison.
         If the mode is preceded by a dash (``-''), this primary evaluates to true if at least all of
         the bits in the mode are set in the file's mode bits.  If the mode is preceded by a plus
         (``+''), this primary evaluates to true if any of the bits in the mode are set in the file's
         mode bits.  Otherwise, this primary evaluates to true if the bits in the mode exactly match the
         file's mode bits.  Note, the first character of a symbolic mode may not be a dash (``-'').

Jadi, Anda perlu:

find . -type f -perm +0111 -print

Ingatlah bahwa OS X adalah berbasis BSD , bukan berbasis Linux, jadi perintah Gnu yang Anda gunakan dalam distribusi Linux (yang findsalah satunya) tidak harus sama dengan yang ada di OS X. Ini bukan perbedaan shell, ini adalah perbedaan alat sistem operasi / utilitas sistem operasi.

Ian C.
sumber
1

Pertanyaan yang sangat lama, saya tahu, tetapi mencari solusi saya mungkin telah menemukan jawaban yang lebih baik.

Masalah utama dengan menggunakan "find" adalah bahwa ia bergantung pada atribut yang disetel ke executable, bahkan jika atribut ini ditetapkan untuk file yang tidak dapat dieksekusi.

MacOS dilengkapi dengan alat baris perintah kecil yang berguna, " file", yang menampilkan informasi file, misalnya:

$> file *

Distribution:             directory
SomeFile.icns:            Mac OS X icon, 3272878 bytes, "ic09" type
MyPicture.png:            PNG image data, 1024 x 1024, 8-bit/color RGBA, non-interlaced
NSHelpers.pas:            Algol 68 source text, ASCII text
myProgram:                Mach-O 64-bit executable x86_64

Seperti yang Anda lihat, 'MyProgram' adalah executable, dan ditunjukkan dengan baik. Karena 32bit executable lama akan memiliki frasa "executable" juga, berikut ini harus mencantumkan semua executable true (binari):

file * | grep "executable"

Semoga ini bermanfaat bagi seseorang yang mencari jawaban untuk pertanyaan yang sama.

Catatan: filetampaknya tidak memiliki fungsi untuk muncul kembali melalui subdirektori.

Hanzaplastique
sumber