Terminaldeki bir klasördeki tüm yürütülebilir dosyaları bulma


19

Çok büyük bir myfolderdosya / klasör hiyerarşisi içeren bir klasör var.
Bu klasördeki tüm yürütülebilir dosyalar nasıl bulunur?

Ubuntu'da şu çalışır: find . -executable -type f

Ancak Mac OS X Mavericks (ayrıca kullanır bash) bunu başaramaz:

find: -executable: unknown primary or operator

Yanıtlar:


30

Bu, yürütülebilir bit setine sahip tüm dosyaları (sembolik bağlantıları değil) bulur:

find . -perm +111 -type f

Bu aynı zamanda (genellikle eşit derecede önemli olan) sembolik bağlantıları bulacaktır.

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

Açık değilse, komutun nasıl çalıştığı aşağıda açıklanmıştır:

  • find Açıkçası bulma programı (:
  • ., ( .= geçerli dizin) içinde bulmaya başlanacak dizini ifade eder
  • -perm +111= çalıştırılabilir bitlerden herhangi biri ayarlandığında ( +"bu bitlerden herhangi biri", 111sahip, grup ve herhangi birindeki yürütülebilir bit için sekizliktir)
  • -type ftürün bir dosya olduğu anlamına gelir
  • -or boolean VEYA
  • -type ltürün sembolik bir bağlantı olduğu anlamına gelir

2
Sen kullanabilirsiniz -Lyerine -or -type lherhangi neden stattarafından yapılan çağrıları finddosyanın istatistikleri dönmek için değil, bağlantı kendisine bağladı.
Ian C.

Bu yaklaşımla bulduğum sorun, herhangi bir dosyanın çalıştırma iznine sahip olabilmesidir. Örneğin, Windows'tan bir metin dosyası indirdikten sonra izin dağıtılır.
Ivan Z. Xiao

5

Ian'ın cevap çalışmasını yapamadım (10.6.8), ancak aşağıdakiler beklenen sonuçları verdi:

find . -type f -perm +0111 -print

güncellemeyi düzenle

Bu da işe yarıyor gibi görünüyor!

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

Sanırım "x" kullanıcı / grup / diğer belirteçler olmadan anlamsızdır.


Sembolik sözdizimi yeni olmalıdır - bunu belirttiğiniz için teşekkürler. Cevabımı sekizlik kullanacak ve eski OS X sürümleriyle geriye dönük olarak uyumlu olacak şekilde güncelledim.
Ian C.

Garip bir şekilde, 10.6 manpage'in o bölümü alıntıladığınızla tamamen aynı .... beni biraz daha derine kazmak ve neler olduğunu görmek için yeterliydi. Yukarıdaki yanıtı değiştirdim.
Kent

2
Sonuç: BDS komut sözdizimi gariptir.
Ian C.

3

Gönderen OS X Bulma işlemi için kılavuz sayfasında :

 -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 (``-'').

Yani ihtiyacın var:

find . -type f -perm +0111 -print

OS X'in Linux tabanlı değil BSD tabanlı olduğunu unutmayın , bu nedenle Linux dağıtımlarında (bunlardan findbiri olan) Gnu komutları OS X'tekilerle aynı değildir. bir kabuk farkı, bir işletim sistemi / işletim sistemi yardımcı programı farkı.


1

Çok eski bir soru, farkındayım, ancak bir çözüm ararken daha iyi bir cevap bulmuş olabilirim.

"Find" işlevini kullanmanın temel sorunu, bu özellik yürütülebilir olmayan bir dosya için ayarlanmış olsa bile, yürütülebilir olarak ayarlanan bir özniteliğe dayanmasıdır.

MacOS file, dosya bilgilerini görüntüleyen kullanışlı küçük bir komut satırı aracı " " ile birlikte gelir , örneğin:

$> 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

Gördüğünüz gibi, 'Programım' yürütülebilir bir dosyadır ve böyle güzel bir şekilde belirtilmiştir. Eski 32bit yürütülebilir dosyalarda da "yürütülebilir" ifadesi bulunacağı için, aşağıdakiler tüm gerçek yürütülebilir dosyaları (ikili dosyaları) listelemelidir:

file * | grep "executable"

Umarım bu aynı soruya cevap arayan biri için de yararlı olacaktır.

Not: filealt dizinler aracılığıyla geri çekilecek bir işleve sahip görünmemektedir.

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.