Find komutunu kullanarak yürütülebilir dosyaları arayın


113

findÇalıştırılabilir dosyaları aramak için Unix komutuyla birlikte ne tür parametre / bayrak kullanabilirim ?


"bul" yazın. Bence '-yürütülebilir' istediğiniz seçenek.
sje397

3
find -executable... ancak bu, listelenen her dosyanın gerçekten çalışacağını garanti etmez
William

1
Tüm uygulamaları findeşit yaratılmamıştır. @ Sje397 ve @William tarafından önerilen seçenek kullanılamayabilir. Aşağıda gösterilen kabul edilen çözümü kullanmak daha iyidir .
LS


Dosya izinlerine dayalı olarak aşağıda gösterilen tüm teklifleri beğenmedim. Argümantasyon: GNU işletim sistemim (Ubuntu) için, örneğin ASCII metin dosyası için "x" (yürütülebilir) bayrağı ayarlamak mümkündür. Hiçbir mimik bu işlemin başarılı bir şekilde tamamlanmasını engellemedi. Birden fazla amaçsız dosyanın x işaretinin atanması için sadece küçük bir hata / hataya ihtiyacı vardır. Bu nedenle gniourf_gniourf'un çözümleri benim kişisel favorimdir. Bununla birlikte, çapraz derlenmiş yürütülebilir dosyalar için bir öykünücüye veya hedef cihaza ihtiyaç duyması dezavantajına sahiptir.
Na13-c

Yanıtlar:


174

Find'ın GNU sürümlerinde şunları kullanabilirsiniz -executable:

find . -type f -executable -print

Find'ın BSD sürümleri için, sekizlik maske -permile birlikte kullanabilirsiniz +:

find . -type f -perm +111 -print

Bu bağlamda "+", "bu bitlerden herhangi birinin ayarlandığı" anlamına gelir ve 111, yürütme bitleridir.

Bunun -executableGNU find'daki yüklemle aynı olmadığını unutmayın . Özellikle, -executabledosyanın mevcut kullanıcı tarafından yürütülebileceğini -perm +111test ederken, yalnızca herhangi bir yürütme izninin ayarlanıp ayarlanmadığını test eder.

GNU'nun eski sürümleri de -perm +111sözdizimini destekler , ancak 4.5.12'den itibaren bu sözdizimi artık desteklenmemektedir. Bunun yerine, -perm /111bu davranışı elde etmek için kullanabilirsiniz .


find: invalid mode ‘+111’Findutils 4.5.11 4.fc20 hatası .
sourcejedi

1
@sourcejedi Teşekkürler. Aslında sadece find'ın GNU olmayan sürümlerinden (özellikle BSD) bahsediyordum, ancak GNU'nun bulduğu eski sürümler de bu sözdizimini destekliyordu. Daha yeni sürümlerde /bunun yerine kullanmanız gerekecek +. Daha fazla ayrıntı için güncellenmiş yanıta bakın.
Laurence Gonsalves

Doğrusu, cevabınızı yanlış anladım. Daha karmaşık hale getirdiğim için özür dilerim :).
sourcejedi

Eğer sembolik bağların yürütülebilir dosyalara da bulunması gerektiğini içerir -Lseçeneği: find -L ....
mklement0

"Eğer sadece testler O "-Executable yüklemi aynı değil" etkilerini anlamak için biraz zaman aldı ve herhangi yürütmek izinleri ayarlanır": Bu demektir -perm +111verebilir yanlış pozitif akım kullanıcı aslında yürütemez yani, dosyaları. Taklit yolu yok -executableneyi ihtiyaç duyulan etmektir çünkü tek başına izinlerini test ederek, ilgili dosyanın kullanıcı ve grup kimliğini geçerli kullanıcının .
mklement 0

35

Temel bir yanlış anlaşılmayı gidermek için @ gniourf_gniourf'a şapka ucu .

Bu cevap , mevcut cevaplara genel bir bakış sağlamaya ve bunların inceliklerini ve göreceli yararlarını tartışmaya ve özellikle taşınabilirlik açısından arka plan bilgisi sağlamaya çalışır .

Yürütülebilir dosyaları bulmak, iki farklı kullanım durumuna başvurabilir :

  • kullanıcı merkezli : mevcut kullanıcı tarafından yürütülebilir dosyaları bulun .
  • dosya merkezli : (bir veya daha fazla) çalıştırılabilir izin biti ayarlanmış dosyaları bulun .

O Not her iki senaryoda da duyu için yapabilir kullanmakfind -L ... yerine sadece find ...amacıyla da bulmak için sembolik yürütülebilir .

En basit dosya merkezli durumun - TÜM üç güvenlik sorumlusu için (kullanıcı, grup, diğer) TÜMÜ için çalıştırılabilir izinler biti ayarlanmış yürütülebilir dosyaları aramak - tipik olarak , ancak mutlaka kullanıcı merkezli senaryo ile aynı sonuçları vermeyeceğini unutmayın - ve bu farkı anlamak önemlidir.

Kullanıcı merkezli ( -executable)

  • Kabul edilen cevap övgüye değer bir şekilde öneriyor -executable, IF GNU find mevcut.

    • GNU findEn birlikte gelir Linux dağıtımlarının
      • Aksine, macOS dahil BSD tabanlı platformlar, daha az güçlü olan BSD find ile birlikte gelir.
    • Senaryonun gerektirdiği gibi, -executableyalnızca geçerli kullanıcının çalıştırabileceği dosyalarla eşleşir (uç durumlar vardır. [1] ).
  • BSD find kabul cevap (sunduğu alternatif -perm +111) bir cevap farklı , dosya -centric soru (cevap kendisi devletler gibi).

    • Sadece kullanma -permcevaplamak için kullanıcı -centric soruyu ise imkansız ihtiyaç duyulan şey olduğunu, çünkü ilgili dosyanın kullanıcı ve grup kimliğini geçerli kullanıcı en oysa -permsadece test edebilirsiniz dosyanın izinlerini.
      Yalnızca POSIX findözelliklerini kullanarak , soru harici yardımcı programları dahil etmeden yanıtlanamaz.
    • Bu durumda, en iyi -perm(kendiliğinden) yapabileceği bir bir yaklaşım arasında -executable. TÜM güvenlik sorumluları (kullanıcı, grup, diğer) için çalıştırılabilir bit setine sahip dosyaları bulmak açısından belki de olduğundan daha yakın bir yaklaşım-perm +111-perm -111 - bu bana tipik gerçek dünya senaryosu gibi geliyor. Bir bonus olarak, POSIX uyumludur ( find -Lsembolik bağlantıları eklemek için kullanın, açıklama için aşağıya bakın):

      find . -type f -perm -111  # or: find . -type f -perm -a=x
  • gniourf_gniourf cevabı bir sağlar gerçek, taşınabilir eşdeğeri-executable kullanılarak-exec test -x {} \;olsa performans pahasına .

    • Birleştiren -exec test -x {} \; ile -perm +111(yani sahip dosyalar en az bir çalıştırılabilir bit kümesi) olup performansına yardımcı olabilir execileri sürülemez ihtiyacı her (şu BSD find POSIX uyumlu eşdeğer kullanan dosyası -perm +111/ GNU bulmak -perm /111; açıklama için daha uzağa aşağıya bakınız) :

      find . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \) -exec test -x {} \; -print

Dosya merkezli ( -perm)

  • To cevap dosyası -centric soruları , ise POSIX uyumlu kullanmak için yeterli -permbirincil (a olarak bilinen teste GNU bulmak terminolojisinde).
    • -permsadece çalıştırılabilirliği değil, herhangi bir dosya iznini test etmenize olanak sağlar .
    • İzinler, sekizlik veya sembolik mod olarak belirtilir . Sekizli modlar sekizlik sayılardır (örneğin 111), sembolik modlar ise dizelerdir (örneğin, a=x).
    • Sembolik modlar , güvenlik sorumlularını u(kullanıcı), g(grup) ve o(diğer) olarak tanımlar veya aüçüne de atıfta bulunur. İzin olarak ifade edilmiştir x, örneğin, yürütülebilir, ve operatörler kullanılarak ilkeleri tahsis =, +ve -; Bir için sekizlik modları dahil olmak üzere tam bir tartışma, bkz için POSIX spec chmodyardımcı programı .
    • Bağlamında find:
      • Bir modun--ug=x önüne (örneğin ) koymak şu anlama gelir: belirtilen tüm izinlere sahip olan dosyalarla eşleştirme (ancak eşleşen dosyalar ek izinlere sahip olabilir).
      • Önek YOK olması (örneğin 755) şu anlama gelir: bu tam, tam izin kümesine sahip dosyalarla eşleştirme .
      • Uyarı : Hem GNU find hem de BSD , are-of-the-belirtilen-izin-bit-kümesi mantığına sahip standart olmayan ek bir önek uygular , ancak bunu uyumsuz sözdizimi ile yapın :
        • BSD bul: +
        • GNU bul: / [2]
      • Bu nedenle, kodunuzun taşınabilir olması gerekiyorsa bu uzantılardan kaçının .
  • Aşağıdaki örnekler, çeşitli dosya merkezli sorulara taşınabilir yanıtları gösterir.

Dosya merkezli komut örnekleri

Not:

  • Aşağıdaki örnekler POSIX uyumludur , yani GNU find ve BSD find dahil olmak üzere herhangi bir POSIX uyumlu uygulamada çalışması gerekir; özellikle, bu şunları gerektirir:
    • Standart olmayan mod önekleri +veya /.
    • Mantıksal işleç ön seçimlerinin POSIX biçimlerini kullanarak :
      • !NOT için (GNU bul ve BSD de izin ver -not); \!Örneklerde !kabuk geçmişi genişletmelerinden korunmak için kullanılan not
      • -aAND için (GNU bul ve BSD de izin ver -and)
      • -oOR için (GNU bul ve BSD bul da izin ver -or)
  • Örnekler sembolik modları kullanır çünkü okunması ve hatırlanması daha kolaydır.
    • Mod öneki ile -, =ve +(örneğin, operatörler birbirinin yerine kullanılabilir -u=xeşdeğerdir -u+x- uyguladıktan sürece -xsonradan, ama bu yapmanın hiçbir anlamı yoktur).
    • ,Kısmi modlara katılmak için kullanın ; VE mantığı ima edilir; örneğin, -u=x,g=xhem kullanıcı hem de grup çalıştırılabilir bitinin ayarlanması gerektiği anlamına gelir .
    • Modlar, negatif eşleşmeyi "sadece bu bit ayarlanmadıysa eşleştir" anlamında ifade edemezler ; -permNOT birincil ile ayrı bir ifade kullanmanız gerekir !.
  • Bul'un geldiğini hatırlatırız ön seçimler (örneğin -print, ya da -perm; da bilinen eylemler ve testlerde GNU find in) olan örtülü katıldı -a(mantıksal AND) ve bu -o(aynı kaçan parantez ve muhtemelen \(ve \)kabuk için) uygulamaya VEYA mantık ihtiyaç vardır.
  • find -L ...Sembolik bağları çalıştırılabilir dosyalar ile find ...eşleştirmek için sadece yerine kullanılır
    • -Ltalimatlar sembolik bağların kendileri yerine sembolik bağların hedeflerini değerlendirmeyi bulur ; bu nedenle, olmadan -L, -type fsembolik bağları tamamen yok sayardı.
# Match files that have ALL executable bits set - for ALL 3 security
# principals (u (user), g (group), o (others)) and are therefore executable
# by *anyone*.
# This is the typical case, and applies to executables in _system_ locations
# (e.g., /bin) and user-installed executables in _shared_ locations
# (e.g., /usr/local/bin), for instance. 
find -L . -type f -perm -a=x  # -a=x is the same as -ugo=x

# The POSIX-compliant equivalent of `-perm +111` from the accepted answer:
# Match files that have ANY executable bit set.
# Note the need to group the permission tests using parentheses.
find -L . -type f \( -perm -u=x -o -perm -g=x -o -perm -o=x \)

# A somewhat contrived example to demonstrate the use of a multi-principial
# mode (comma-separated clauses) and negation:
# Match files that have _both_ the user and group executable bit set, while
# also _not_ having the other executable bit set.
find -L . -type f -perm -u=x,g=x  \! -perm -o=x

[1] GNU 4.4.2'den -executableitibaren açıklaması man find:

Yürütülebilir dosyalar ve aranabilir dizinlerle eşleşir (dosya adı çözünürlüğü anlamında). Bu, erişim kontrol listelerini ve -perm testinin yok saydığı diğer izin yapılarını hesaba katar. Bu test erişim (2) sistem çağrısını kullanır ve bu nedenle, birçok sistem istemcinin çekirdeğinde erişimi (2) uyguladığından ve bu nedenle UID eşleme (veya kök ezme) yapan NFS sunucuları tarafından kandırılabilir ve bu nedenle sunucuda tutulan UID eşleme bilgileri. Bu test yalnızca erişim (2) sistem çağrısının sonucuna dayandığından, bu testin başarılı olduğu bir dosyanın gerçekten yürütülebileceğinin garantisi yoktur.

[2] GNU , 4.5.12'den daha eski sürümlerin de öneke izin verdiğini tespit etti +, ancak bu ilk önce kullanımdan kaldırıldı ve sonunda kaldırıldı, çünkü sembolik modlarla birleştirmek +, kesin bir izin maskesi olarak yorumlandığından büyük olasılıkla beklenmedik sonuçlar doğurur . Eğer bir sürümüne (a) çalışma öncesinde 4.5.12 ve (b) kendinizi sınırlamak sekizlik modları sadece, sen verebilir kullanarak paçayı ile hem GNU bulup BSD Bul, ama iyi bir fikir değil.+


2
Şimdiye kadarki en kapsamlı SO cevabı? ;)
andynormancx

@andynormancx :) Çok sayıda mermi noktası açısından, bu yarışmacıyı önerebilirim .
mklement0

11

Mevcut kullanıcı tarafından yürütülebilir dosyaları bulmak için başka bir olasılığa 1 sahip olmak için:

find . -type f -exec test -x {} \; -print

(buradaki test komutu PATH'de bulunan komuttur, büyük olasılıkla /usr/bin/testyerleşikte değil).


1 Bunu yalnızca -executablebayrağı findmevcut değilse kullanın ! bu -perm +111çözümden biraz farklıdır .


2
Bu işe yarıyor, ancak oldukça yavaş. Ayrıca, kabuk bağlı olarak, gibi sarın veya dosya adı yer tutucu kaçmak zorunda kalabilirsiniz '{}'veya \{\}.
Ionoclast Brigham

1
@ mklement0 bu benim tarafımdan yürütülebilir olan komutları bulamayacak -executable.
gniourf_gniourf

1
Teşekkürler @gniourf_gniourf - Orada gerçekten birkaç yanlış anlamam vardı. ": Şimdi cevabımı silme için en az olduğum için (bir şey kurtarılabilir var EĞER belki, dirilen edilecek), burada diğer yorumunu reprinting ediyorum find . -type f -perm -u=xedilir değil eşdeğer -executable: -executablekullanıcı yürütebileceği tüm dosyaları eşleşir ve bunlar şunlardır g+xEğer uygun gruptaysam veya o+x. Aslında -perm -u=xkullanıcının yürütemeyeceği çok sayıda dosya bulacak ve kullanıcının yürütebileceği birkaçını kaçıracak. "
mklement 0

1
@IonoclastBrigham: Alıntı {}yapmak varsayımsal bir gereklilik olsa da (ve alıntı yapmak zarar vermez), pratikte POSIX benzeri kabuklarda gerekli değildir ve csh. O nereye sen kabukları biliyor musunuz edilir gerekli?
mklement 0

4
@IonoclastBrigham: İlginç, teşekkürler; yani, içinde fish, {}gerçekten ya '{}'da olarak kaçılmalıdır \{\}. Not bash, kshve zshbağ aynı genleşme tür sağlamak; Bununla birlikte, bu işlem görmeyen belirteci baskı {} olarak (ve böylece: kaçan gerek), bunlar oa düşünmüyoruz çünkü geçerli bağ ifade (bunlar en az ihtiyaç 2 , parçacıklar ya da geçerli bir sayısal dizi ekspresyonu) ise fish gördüğü {}bir geçerli bir bağ boş dizeyle sonuçlanan ifade .
mklement0

9

-executableTest bayrağını kullanabilirsiniz :

-executable
              Matches files which are executable  and  directories  which  are
              searchable  (in  a file name resolution sense).

4
-Executable sözde bilinmeyen bir seçenektir.
aslında

4
Bu bir GNU Find uzantısı olabilir mi? Etiket Linux değil, Unix olduğundan, en azından bir GNU uzantısının bu şekilde belgelenmesi gerekir.
Jonathan Leffler

3
Bu seçenek, en azından OS X'te bulunan BSD find komutu tarafından desteklenmemektedir. Bu bir GNU uzantısıdır, ancak diğer bulma türleri tarafından desteklenebilir.
Ionoclast Brigham

FWIW, bunu sles 10'da değil, sles> = 11'de buldum (biraz yandı)
Peter Turner

Bunun aslında tüm örnekleri almadığını unutmayın. Benim durumumda ben olarak sahip olunan bir dosya var -rw-r-xr-xhangi -executablealgılamaz
Dezza

2

Bu benim için çalıştı ve paylaşmayı düşündüm ...

find ./ -type f -name "*" -not -name "*.o" -exec sh -c '
    case "$(head -n 1 "$1")" in
      ?ELF*) exit 0;;
      MZ*) exit 0;;
      #!*/ocamlrun*)exit0;;
    esac
exit 1
' sh {} \; -print

13
Sadece binlerce vaka daha ve yeniden keşfedilmiş olacaksınız file!
üçlü

@tripleee +1. Bu uzantı harika olurdu:find ./ -mime application/x-sharedlib -o -mime application/x-dosexec
Daniel Alder

@Daniel Alder, bulmanın hangi sürümünü kullanıyorsun? Bulmada -mime seçeneğini bulamadım (GNU findutils) 4.4.2
AjayKumarBasuthkar

@tripleee +1. 'dosya' ve / 'mimetype' kullanmak iyi bir fikirdir veya -mime'yi destekleyen sürümü bulmak daha iyidir. Ayrıca 'dosya' / 'mimetype'ın yalnızca çalıştırılabilir (ler) i filtreleme ve görüntüleme seçeneğinin olup olmadığını merak ediyorum.
AjayKumarBasuthkar

2
find . -executable -type f

dosyanın yürütülebilir olduğunu gerçekten garanti etmez, yürütme biti kümesine sahip dosyaları bulur. Yaparsan

chmod a+x image.jpg

Yukarıdaki bul, image.jpg dosyasının, yürütme biti ayarlanmış bir jpeg görüntüsü olsa bile çalıştırılabilir olduğunu düşünecektir.

Genelde bu sorunu çözerim:

find . -type f -executable -exec file {} \; | grep -wE "executable|shared object|ELF|script|a\.out|ASCII text"

Bulmanın çalıştırılabilir dosyalar hakkında gerçekten kubbe bilgilerini yazdırmasını istiyorsanız, aşağıdaki gibi bir şey yapabilirsiniz:

find . -type f -executable -printf "%i.%D %s %m %U %G %C@ %p" 2>/dev/null |while read LINE
do
  NAME=$(awk '{print $NF}' <<< $LINE)
  file -b $NAME |grep -qEw "executable|shared object|ELF|script|a\.out|ASCII text" && echo $LINE
done

Yukarıdaki örnekte, dosyanın tam yol adı son alandadır ve dosya adı içinde başka bir yerdeyse awk "NAME = $ (awk '{print $ NF}' <<< $ LINE)" ile aradığınız yeri yansıtmalıdır. "NF" yi doğru sayısal konumla değiştirmeniz gereken bulma çıktı dizesi. Ayırıcınız boşluk değilse, awk'ye ayırıcınızın ne olduğunu da söylemeniz gerekir.


1

Bunun süper kolay olmaması çok saçma ... imkansızın yanında bırakın . Eller yukarı, Apple / Spotlight'a ertelerim ...

mdfind 'kMDItemContentType=public.unix-executable'

En azından işe yarıyor!


mdfindOSX hakkında bilmek güzel . Komutunuzun tüm sistem için Unix çalıştırılabilirlerini rapor ettiğini unutmayın . mdfind -onlyin . 'kMDItemContentType=public.unix-executable'sonuçları geçerli dizinin alt ağacıyla sınırlar. Küçük ilgi alanları: Aramayı yalnızca belirli bir dizinle sınırlamak (alt klasörler olmadan) görünüşe göre desteklenmiyor. Yürütülebilir dosyalara sembolik bağlantılar , görünüşe göre hiçbir zaman dahil edilmemiştir. İlginç bir şekilde, mdfindçalıştırılabilir bir dosya bulduğunda, daha sonra yürütülebilir bitin kaldırılması alınmaz .
mklement0

Spotlight'ın çalıştırılabilir Unix dosyalarını nasıl algıladığı / saptadığı konusunda hatalar bulduğumu düşünüyorum; Apple ile ve ayrıca openradar.me/20162683 adresinde bir hata bildirdim . Sizi - ve bu işlevle ilgilenen diğer herkesi - bugreport.apple.com adresinde bir hata bildirmenizi tavsiye ederim.
mklement0

(Yorum telaşı için özür dilerim; umarım şimdi haklıdırlar) yaptığı mdfind -onlyin . 'kMDItemContentType=public.unix-executable'gibi davranır find . -type f -perm +111 -print. Yani, herhangi bir yürütülebilir bit kümesine sahip dosyaları bulur ve bu, yanlış pozitifler verebilir (ancak bu pratikte bir sorun olmayabilir) - gerçekten yalnızca mevcut kullanıcı tarafından BSD find kullanarak yürütülebilir dosyaları bulmak için, bkz. @ Gniourf_gniourf'un yanıtı. findTabanlı bir çözümü kullanmak , bulabileceğiniz avantaja sahiptir sembolik (seçeneği istenirse, hem de yürütülebilir dosyalara -L), mdfindgörünüşte yapamaz.
mklement 0

1
@ mklement0 cevabım süslemelerden kaçınıyordu - eve dönmeyi denemek ve çivilemek için - ama evet, bu "cilasız" formu neredeyse hiç kullanmazsınız. başka bir seçenek - onun ortaya çıkıp çıkmadığından emin değilim - eski güzel bir yumru .. ls /Applications/**/*(*)senin (benim?) zshkabuğunun içinde
Alex Gray

Kullanışlı zshipucu için teşekkürler - bunu bilmiyordum; ( Yürütülebilir dosyalar ( ) veya sembolik bağlarla ( ) eşleşebilirsin ama ikisini birden eşleştiremezsin , değil mi?). Asıl amacınıza gelince: Tekrar belirteyim: daha fazla esneklik sağlarken komutunuzun yaptığını yapacak . Hatta POSIX uyumlu olacak şekilde yeniden formüle edebilirsiniz. *@find . -type f -perm +a=xmdfind
mklement0

1

Kolay cevap şu olacaktır: "yürütülebilir dosyalarınız PATH değişkeninizde bulunan dizinlerde bulunur", ancak bu çalıştırılabilir dosyalarınızı gerçekten bulamaz ve yine de birçok çalıştırılabilir dosyayı gözden kaçırabilir.

Mac hakkında pek bir şey bilmiyorum ama bence "mdfind 'kMDItemContentType = public.unix-execable" "yorumlanan betikler gibi şeyleri gözden kaçırabilir

Yürütülebilir bit kümesine sahip dosyaları bulmanız uygunsa (gerçekten yürütülebilir olup olmadıklarına bakılmaksızın), o zaman yapmanız sorun değil

find . -type f -perm +111 -print

desteklendiğinde, "-executable" seçeneği acl ve diğer izin yapılarına bakan başka bir filtre oluşturacaktır, ancak teknik olarak "-pemr +111" den pek farklı değildir.

Belki ileride "-magic" i destekleyecek ve belirli bir sihirli kimliği olan dosyalara açıkça bakmanıza izin verecek ... ancak o zaman tüm çalıştırılabilir formatların sihirli kimliğini düzeltmeyi belirtmeniz gerekir.

Unix'te teknik olarak doğru bir kolay çıkış yolunun farkında değilim.


1

Dolayısıyla, yalnızca yürütme iznine sahip dosyaları değil, çalıştırılabilir dosya türlerini (örneğin, komut dosyaları, ELF ikili dosyaları vb.) Bulmak istiyorsanız, muhtemelen bunun gibi bir şey yapmak istersiniz (burada mevcut dizin. Herhangi bir şeyle değiştirilebilir. istediğiniz dizin):

 gfind . -type f -exec bash -c '[[ $(file -b "'{}'") == *" executable "* ]] ' \; -print

Veya macports kullanmayanlar (linux kullanıcıları) veya başka bir şekilde gnu find'ı istediğiniz gibi bulanlar için:

 find . -type f -exec bash -c '[[ $(file -b "'{}'") == *" executable "* ]] ' \; -print

Yine de OS X kullanıyorsanız, is_exec adında bir yerde gizli olan ve bu küçük testi sizin için bir araya getiren küçük bir yardımcı programla birlikte gelir, böylece bulursanız komut satırını kısaltabilirsiniz. Ancak bu yol daha esnektir, çünkü == testini = ~ testiyle kolayca değiştirebilir ve çalıştırılabilir düz metin dosyaları veya dosya komutunuzun döndürdüğü diğer bilgiler gibi daha karmaşık özellikleri kontrol etmek için kullanabilirsiniz.


Buradaki alıntı için kesin kurallar oldukça belirsizdir, bu yüzden sadece deneme yanılma yoluyla üzerinde çalışıyorum, ancak doğru açıklamayı duymak isterim.


0

Ben de aynı sorunu yaşadım ve cevap dmenu kaynak kodundaydı: bu amaç için yapılan stest yardımcı program. 'Stest.c' ve 'arg.h' dosyalarını derleyebilirsiniz ve çalışmalıdır. Kolaylık sağlamak için oraya koyduğum kullanım için bir kılavuz sayfası var:

STEST(1)         General Commands Manual         STEST(1)

NAME
       stest - filter a list of files by properties

SYNOPSIS
       stest  [-abcdefghlpqrsuwx]  [-n  file]  [-o  file]
       [file...]

DESCRIPTION
       stest takes a list of files  and  filters  by  the
       files'  properties,  analogous  to test(1).  Files
       which pass all tests are printed to stdout. If  no
       files are given, stest reads files from stdin.

OPTIONS
       -a     Test hidden files.

       -b     Test that files are block specials.

       -c     Test that files are character specials.

       -d     Test that files are directories.

       -e     Test that files exist.

       -f     Test that files are regular files.

       -g     Test  that  files  have  their set-group-ID
              flag set.

       -h     Test that files are symbolic links.

       -l     Test the contents of a directory  given  as
              an argument.

       -n file
              Test that files are newer than file.

       -o file
              Test that files are older than file.

       -p     Test that files are named pipes.

       -q     No  files are printed, only the exit status
              is returned.

       -r     Test that files are readable.

       -s     Test that files are not empty.

       -u     Test that files have their set-user-ID flag
              set.

       -v     Invert  the  sense  of  tests, only failing
              files pass.

       -w     Test that files are writable.

       -x     Test that files are executable.

EXIT STATUS
       0      At least one file passed all tests.

       1      No files passed all tests.

       2      An error occurred.

SEE ALSO
       dmenu(1), test(1)

                        dmenu-4.6                STEST(1)
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.