कमांड खोजने के लिए निष्पादन योग्य फ़ाइलों की खोज करें


113

मैं यूनिक्स findकमांड के साथ किस प्रकार के पैरामीटर / ध्वज का उपयोग कर सकता हूं ताकि मैं निष्पादन योग्य खोज करूं?


टाइप 'मैन फाइंड'। मुझे लगता है कि '-executable' वह विकल्प है जो आप चाहते हैं।
sje397

3
find -executable... लेकिन यह गारंटी नहीं देता है कि सूचीबद्ध प्रत्येक फ़ाइल वास्तव में निष्पादित करेगी
विलियम

1
सभी कार्यान्वयन findसमान नहीं बनाए गए हैं। @ Sje397 और @William द्वारा अनुशंसित विकल्प उपलब्ध नहीं हो सकता है। नीचे दिखाए गए स्वीकृत समाधान का उपयोग करना बेहतर है ।
एलएस


मुझे नीचे दिखाए गए सभी प्रस्तावों को नापसंद है जो फ़ाइल अनुमतियों पर आधारित हैं। तर्क: मेरे GNU ऑपरेटिंग सिस्टम (Ubuntu) के लिए यह संभव है कि उदाहरण के लिए ASCII टेक्स्ट फ़ाइल के लिए "x" (निष्पादन योग्य) ध्वज सेट किया जाए। किसी भी मिमिकल ने इस ऑपरेशन को सफल होने से नहीं रोका। एक्स फ्लैग को असाइन करने के लिए कई गैर-इरादे वाली फ़ाइलों के लिए बस छोटी सी गलती / बग की आवश्यकता होती है। इसलिए gniourf_gniourf 'समाधान मेरा निजी पसंदीदा है। यह हालांकि यह है कि क्रॉस-संकलित निष्पादन योग्य के लिए एक एमुलेटर या लक्ष्य डिवाइस की आवश्यकता है।
Na13-c

जवाबों:


173

खोज के GNU संस्करणों पर आप उपयोग कर सकते हैं -executable:

find . -type f -executable -print

खोज के BSD संस्करणों के लिए, आप एक ऑक्टल मास्क के -permसाथ उपयोग कर सकते हैं +:

find . -type f -perm +111 -print

इस संदर्भ में "+" का अर्थ है "इनमें से कोई भी बिट सेट है" और 111 निष्पादन बिट्स है।

ध्यान दें कि यह -executableGNU खोज में विधेय के समान नहीं है । विशेष रूप से, -executableपरीक्षण कि फ़ाइल को वर्तमान उपयोगकर्ता द्वारा निष्पादित किया जा सकता है, जबकि -perm +111बस परीक्षण करता है यदि कोई निष्पादन अनुमतियाँ सेट हैं।

GNU के पुराने संस्करण भी -perm +111सिंटैक्स का समर्थन करते हैं, लेकिन 4.5.12 तक यह सिंटैक्स अब समर्थित नहीं है। इसके बजाय, आप -perm /111इस व्यवहार को प्राप्त करने के लिए उपयोग कर सकते हैं ।


find: invalid mode ‘+111’4.5.11 4.fc20 पर findutils पर त्रुटि ।
sourcejedi

1
@sourcejedi धन्यवाद मैं वास्तव में केवल खोज के गैर-जीएनयू संस्करणों (बीएसडी, विशेष रूप से) के बारे में बात कर रहा था, लेकिन जीएनयू के पुराने संस्करणों ने वास्तव में उस वाक्य रचना का भी समर्थन किया। नए संस्करणों में आपको /इसके बजाय उपयोग करना होगा +। अधिक विवरण के लिए अद्यतन उत्तर देखें।
लॉरेंस गोन्साल्व्स

दरअसल, मैंने आपके जवाब को गलत बताया। इसे और अधिक जटिल बनाने के लिए क्षमा करें :)।
sourcejedi

यदि निष्पादन योग्य फ़ाइलों के लिए सहानुभूति भी मिलनी चाहिए, तो -Lविकल्प शामिल करें find -L ...:।
mklement0

मुझे "अप्रभावी विधेय के समान नहीं" और "बस परीक्षणों की तरह यदि कोई निष्पादन अनुमतियाँ निर्धारित की गई हैं" के निहितार्थ को समझने में थोड़ा समय लगा : इसका मतलब यह है कि झूठी सकारात्मकता-perm +111 उत्पन्न हो सकती है , अर्थात, वर्तमान उपयोगकर्ता वास्तव में निष्पादित नहीं कर सकता है। वहाँ का अनुकरण करने के कोई रास्ता नहीं है , क्योंकि जो आवश्यक है करने के लिए है, अकेले अनुमतियों के परीक्षण से संबंधित फाइल की करने के लिए उपयोगकर्ता और समूह की पहचान वर्तमान उपयोगकर्ता के-executable
mklement0

35

एक बुनियादी गलत धारणा को साफ करने के लिए @ gniourf_gniourf को टोपी का टिप ।

यह उत्तर मौजूदा उत्तरों का अवलोकन प्रदान करने और उनकी सूक्ष्मताओं और सापेक्ष गुणों के साथ-साथ पृष्ठभूमि की जानकारी प्रदान करने के लिए चर्चा करने का प्रयास करता है , विशेष रूप से पोर्टेबिलिटी के संबंध में ।

निष्पादन योग्य होने वाली फ़ाइलों को खोजना दो अलग-अलग उपयोग मामलों को संदर्भित कर सकता है :

  • उपयोगकर्ता-केंद्रित : उन फ़ाइलों को ढूंढें, जो वर्तमान उपयोगकर्ता द्वारा निष्पादन योग्य हैं ।
  • फ़ाइल-केंद्रित : उन फ़ाइलों को ढूंढें जिनके पास (एक या अधिक) निष्पादन योग्य अनुमति बिट सेट हैं

ध्यान दें कि या तो परिदृश्य में इसका उपयोगfind -L ... करने के लिए समझदारी हो सकती find ...है ताकि निष्पादन योग्य लोगों के लिए भी सहानुभूति मिल सके

ध्यान दें कि सरलतम फ़ाइल-केंद्रित मामला - सभी तीन सुरक्षा प्रिंसिपलों (उपयोगकर्ता, समूह, अन्य) के लिए निष्पादित निष्पादन योग्य बिट्स के साथ निष्पादन योग्य की तलाश में - आमतौर पर होगा , लेकिन जरूरी नहीं कि उपयोगकर्ता-केंद्रित परिदृश्य के समान परिणाम मिले - और यह है अंतर समझना महत्वपूर्ण है।

उपयोगकर्ता-केंद्रित ( -executable)

  • स्वीकार किए जाते हैं जवाब भाँति सिफारिश की गई है -executable, यदि जीएनयू find उपलब्ध है।

    • GNU findअधिकांश लिनक्स डिस्ट्रोस के साथ आता है
      • इसके विपरीत, बीएसडी-आधारित प्लेटफॉर्म, जिसमें मैकओएस शामिल हैं, बीएसडी खोज के साथ आते हैं, जो कम शक्तिशाली है।
    • जैसा कि परिदृश्य की मांग है, -executableमैच केवल फाइलों को चालू कर सकते हैं जो उपयोगकर्ता निष्पादित कर सकते हैं (किनारे के मामले हैं। [१] )।
  • बीएसडी find विकल्प स्वीकार किए जाते हैं जवाब (द्वारा की पेशकश की -perm +111) एक उत्तर देता है अलग , फ़ाइल केंद्रित प्रश्न (उत्तर खुद के रूप में कहा गया है)।

    • बस का उपयोग करते हुए -permजवाब देने के लिए उपयोगकर्ता केंद्रित सवाल यह है कि असंभव है क्योंकि क्या जरूरत है के लिए है, संबंधित फाइल की करने के लिए उपयोगकर्ता और समूह की पहचान वर्तमान उपयोगकर्ता के है, जबकि -permकेवल परीक्षण कर सकते हैं फ़ाइल के अनुमतियों।
      केवल POSIX findसुविधाओं का उपयोग करते हुए , इस प्रश्न का उत्तर बाहरी उपयोगिताओं को शामिल किए बिना नहीं दिया जा सकता है।
    • इस प्रकार, सबसे अच्छा -permकर सकते हैं (खुद के द्वारा) का एक अनुमान है -executableशायद इससे कहीं अधिक निकटता-perm +111 है-perm -111 , इसलिए उन फ़ाइलों को खोजने के लिए जिनके पास सभी सुरक्षा प्रिंसिपलों (उपयोगकर्ता, समूह, अन्य) के लिए निष्पादन योग्य बिट सेट है - यह मुझे विशिष्ट वास्तविक दुनिया परिदृश्य के रूप में हमला करता है। एक बोनस के रूप में, यह POSIX- आज्ञाकारी होना भी शामिल है ( find -Lसिमिलिंक को शामिल करने के लिए उपयोग करें, स्पष्टीकरण के लिए नीचे देखें):

      find . -type f -perm -111  # or: find . -type f -perm -a=x
  • gniourf_gniourf का उत्तर प्रदर्शन की कीमत पर एक सही, पोर्टेबल समतुल्य-executable , उपयोग-exec test -x {} \;, उपलब्ध कराता है।

    • के -exec test -x {} \; साथ संयोजन-perm +111 (यानी, कम से कम एक निष्पादन योग्य बिट सेट के साथ फ़ाइलें ) उस प्रदर्शन में मदद कर सकता है जिसे हर फ़ाइल के execलिए लागू करने की आवश्यकता नहीं होती है (निम्नलिखित बीएसडी / पीओएसयू के POSIX-compliant समकक्ष का उपयोग करता है / एक विवरण के लिए नीचे देखें;) :-perm +111-perm /111

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

फ़ाइल-केंद्रित ( -perm)

  • करने के लिए जवाब देने फ़ाइल केंद्रित सवाल है, यह है POSIX अनुरूप उपयोग करने के लिए पर्याप्त -permप्राथमिक (एक के रूप में जाना परीक्षण जीएनयू खोजने शब्दावली में)।
    • -permआपको किसी भी फ़ाइल अनुमतियों के लिए परीक्षण करने की अनुमति देता है , न कि केवल निष्पादन योग्यता।
    • अनुमतियाँ या तो अष्टाधारी या प्रतीकात्मक मोड के रूप में निर्दिष्ट हैं । ऑक्टल मोड्स ऑक्टल नंबर (जैसे 111) हैं, जबकि प्रतीकात्मक मोड स्ट्रिंग्स (जैसे a=x) हैं।
    • प्रतीकात्मक मोड सुरक्षा प्रिंसिपल u(उपयोगकर्ता), g(समूह) और o(अन्य), या aतीनों को संदर्भित करने के लिए पहचानते हैं । xउदाहरण के लिए, निष्पादन योग्य के रूप में अनुमतियाँ व्यक्त की जाती हैं , और ऑपरेटरों का उपयोग करके प्रिंसिपलों को सौंपा जाता है =, +और -; एक पूर्ण चर्चा के लिए, जिसमें ऑक्टल मोड शामिल हैं, उपयोगिता के लिए POSIX कल्पनाchmod देखें
    • के संदर्भ में find:
      • किसी मोड के साथ प्रीफ़िक्सिंग करना- (उदाहरण के लिए -ug=x) का अर्थ है: उन फ़ाइलों से मेल खाना, जिनमें सभी अनुमतियाँ निर्दिष्ट हैं (लेकिन मिलान करने वाली फ़ाइलों में अतिरिक्त अनुमतियां हो सकती हैं)।
      • बीत रहा है कोई उपसर्ग (उदाहरण के लिए 755इस है कि मैच फ़ाइलें:) साधन पूर्ण, सटीक अनुमतियों के सेट।
      • कैविएट : जीएनयू और बीएसडी दोनों एक अतिरिक्त, गैर- उपसर्ग उपसर्ग लागू करते हैं, जो किसी भी-के-निर्दिष्ट-अनुमति-बिट्स-सेट तर्क के साथ लागू होते हैं , लेकिन असंगत सिंटैक्स के साथ ऐसा करते हैं :
        • बीएसडी खोजें: +
        • GNU खोजें: / [२]
      • इसलिए, इन एक्सटेंशनों से बचें, यदि आपका कोड पोर्टेबल होना चाहिए
  • नीचे दिए गए उदाहरण विभिन्न फ़ाइल-केंद्रित प्रश्नों के पोर्टेबल उत्तर प्रदर्शित करते हैं।

फ़ाइल-सेंट्रिक कमांड उदाहरण

ध्यान दें:

  • निम्नलिखित उदाहरण POSIX- संगत हैं , जिसका अर्थ है कि उन्हें किसी भी POSIX- संगत कार्यान्वयन में काम करना चाहिए, जिसमें GNU फाइंड और BSD मिलें; विशेष रूप से, इसकी आवश्यकता है:
    • गैर-मानक मोड उपसर्गों का उपयोग नहीं कर रहा है +या /
    • तार्किक-ऑपरेटर प्राइमरी के POSIX रूपों का उपयोग करना :
      • !नहीं के लिए (GNU खोज और BSD भी अनुमति देते हैं -not); ध्यान दें कि \!इसका उपयोग !शेल इतिहास के विस्तार से बचाने के लिए उदाहरणों में किया जाता है
      • -aAND (GNU खोजो और BSD खोजो अनुमति भी -and)
      • -oOR (GNU खोजो और BSD भी अनुमति दें -or)
  • उदाहरण प्रतीकात्मक मोड का उपयोग करते हैं, क्योंकि वे पढ़ने और याद रखने में आसान होते हैं।
    • मोड उपसर्ग के साथ -, =और +ऑपरेटरों को परस्पर उपयोग किया जा सकता है (उदाहरण के लिए, -u=xइसके बराबर -u+x- जब तक आप -xबाद में आवेदन नहीं करते हैं , लेकिन ऐसा करने का कोई मतलब नहीं है)।
    • ,आंशिक मोड में शामिल होने के लिए उपयोग करें ; और तर्क निहित है; उदाहरण के लिए, -u=x,g=xइसका मतलब है कि उपयोगकर्ता और समूह निष्पादन योग्य बिट दोनों को सेट किया जाना चाहिए।
    • मोड्स स्वयं "यदि यह बिट सेट नहीं है तो मैच" के अर्थ में नकारात्मक मिलान व्यक्त नहीं कर सकते हैं ; तो आपको एक अलग का उपयोग करना चाहिए -perm, न कि प्राथमिक साथ अभिव्यक्ति !
  • ध्यान दें कि GNU में प्राइमरी (जैसे कि -print, या -perm; कार्यों और परीक्षणों के रूप में भी जाना जाता है ) को स्पष्ट रूप से -a(तार्किक और) के साथ जोड़ा जाता है , और यह कि -oसंभवतः ( या शेल के लिए बच गए ) \(और \)तर्क को लागू करने के लिए आवश्यक हैं।
  • find -L ...सिर्फ़ के बजाय find ...इसका उपयोग निष्पादन योग्य लोगों के लिए सहानुभूति से मेल खाने के लिए भी किया जाता है
    • -Lनिर्देश सिम्बलिंक के बजाय स्वयं के लक्ष्य का मूल्यांकन करने के लिए खोजते हैं; इसलिए, बिना -L, -type fपूरी तरह से सहानुभूति की उपेक्षा करेगा।
# 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] का विवरण -executableसे man findजीएनयू के रूप में लगता है 4.4.2:

फाइलों का मिलान होता है जो निष्पादन योग्य और निर्देशिकाएं होती हैं जो खोज करने योग्य होती हैं (एक फ़ाइल नाम रिज़ॉल्यूशन अर्थ में)। यह खाता नियंत्रण सूचियों और अन्य अनुमतियों को ध्यान में रखता है, जो -perm परीक्षण की अनदेखी करता है। यह परीक्षण एक्सेस (2) सिस्टम कॉल का उपयोग करता है, और इसलिए इसे एनएफएस सर्वरों द्वारा बेवकूफ बनाया जा सकता है जो यूआईडी मैपिंग (या रूट-स्क्वैशिंग) करते हैं, क्योंकि कई सिस्टम क्लाइंट के कर्नेल में एक्सेस (2) लागू करते हैं और इसलिए सामग्री का उपयोग नहीं कर सकते हैं सर्वर पर आयोजित यूआईडी मैपिंग की जानकारी। क्योंकि यह परीक्षण केवल एक्सेस (2) सिस्टम कॉल के परिणाम पर आधारित है, इस बात की कोई गारंटी नहीं है कि एक फ़ाइल जिसके लिए यह परीक्षण सफल होता है वास्तव में निष्पादित किया जा सकता है।

[२] जीएनयू ४.५.१२ से अधिक पुराने संस्करणों को भी उपसर्ग की अनुमति देता है +, लेकिन इसे पहले हटा दिया गया था और अंततः हटा दिया गया था, क्योंकि प्रतीकात्मक मोड के +साथ संयोजन से सटीक अनुमति मुखौटा के रूप में व्याख्या किए जाने के कारण अप्रत्याशित परिणाम प्राप्त होते हैं। यदि आप (क) एक संस्करण पर रन से पहले 4.5.12 और (ख) के लिए अपने आप को प्रतिबंधित अष्टाधारी मोड केवल, तुम सकता है का उपयोग कर के साथ दूर होने के साथ दोनों जीएनयू खोजने के लिए और बीएसडी पाते हैं, लेकिन यह एक अच्छा विचार नहीं है।+


2
सबसे व्यापक तो कभी उत्तर? ;)
andynormancx

@andynormancx :) खैर, बुलेट अंक की सरासर संख्या के संदर्भ में, मैं इस दावेदार की पेशकश कर सकता हूं ।
mklement0

11

ताकि वर्तमान उपयोगकर्ता द्वारा निष्पादन योग्य फ़ाइलों को खोजने के लिए एक और संभावना 1 हो:

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

(यहाँ परीक्षण आदेश PATH में पाया गया है, बहुत संभावना है /usr/bin/test, बिलिन नहीं है)।


1 इसका उपयोग केवल अगर -executableझंडा findउपलब्ध नहीं है! यह -perm +111समाधान से सूक्ष्म रूप से भिन्न है ।


2
यह काम करता है, लेकिन यह बहुत धीमा है। इसके अलावा, शेल के आधार पर, आपको फ़ाइलनाम स्थान धारक को लपेटना या बचना पड़ सकता है, जैसे '{}'या \{\}
आयनोकॉस्ट ब्रिघम जूल

1
@ mklement0 यह मेरे द्वारा निष्पादित -executableया मेरे आदेश की तरह निष्पादन योग्य आदेशों को नहीं खोजेगा ।
गनीउर्फ़_ग्निआउरफ़

1
धन्यवाद, @gniourf_gniourf - मुझे वास्तव में वहाँ कुछ गलतफहमी थी। मैं यहाँ अपने अन्य टिप्पणी पुनर्मुद्रित रहा हूँ, क्योंकि अब मैं अपने जवाब को हटाने के लिए कम से कम कर रहा हूँ (शायद पुनर्जीवित किया जाना है, अगर कोई ऐसा कार्य salvageable): " find . -type f -perm -u=xहै नहीं के बराबर -executable: -executableसभी फ़ाइलें उपयोगकर्ता निष्पादित कर सकते हैं मैच, और इन में शामिल g+xअगर मैं उचित समूह में हूं या o+xवास्तव में -perm -u=xबहुत सारी फाइलें मिलेंगी जो उपयोगकर्ता निष्पादित नहीं कर सकते हैं, और कुछ को याद कर सकते हैं जो उपयोगकर्ता निष्पादित कर सकता है। "
mklement0

1
@IonoclastBrigham: जबकि उद्धरण {}करना एक काल्पनिक आवश्यकता है (और उद्धृत करना चोट नहीं करता है), व्यवहार में यह POSIX जैसे गोले में आवश्यक नहीं है और csh। क्या आपको पता है कि गोले की आवश्यकता कहाँ होती है?
mklement0

4
@IonoclastBrigham: दिलचस्प, धन्यवाद; इसलिए, वास्तव में fish, या {}तो बच जाना चाहिए '{}'या \{\}। ध्यान दें कि bash, ksh, और zshब्रेस विस्तार की एक ही तरह प्रदान करते हैं; तथापि, वे गैर उद्धृत टोकन प्रिंट {} के रूप में है (और इस प्रकार: बचने की कोई आवश्यकता नहीं), क्योंकि वे इसे एक विचार नहीं करते वैध ब्रेस अभिव्यक्ति (वे कम से कम की आवश्यकता होती है 2 , टोकन, या मान्य संख्या अनुक्रम अभिव्यक्ति) जबकि fish समझे {}एक वैध ब्रेस खाली स्ट्रिंग में परिणाम ।
mklement0

9

आप -executableपरीक्षण ध्वज का उपयोग कर सकते हैं :

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

4
-अवसादक माना जाता है कि एक अज्ञात विकल्प है।
वास्तव

4
क्या वह ग्नू फाइंड एक्सटेंशन होगा? चूंकि टैग यूनिक्स है, लिनक्स नहीं, कम से कम जीएनयू एक्सटेंशन को इस तरह से प्रलेखित करने की आवश्यकता है।
जोनाथन लेफ़लर

3
यह विकल्प बीएसडी द्वारा कमांड का समर्थन नहीं करता है जो ओएस एक्स पर कम से कम पाया जाता है। यह एक जीएनयू एक्सटेंशन है, लेकिन खोज के अन्य स्वादों द्वारा समर्थित हो सकता है।
आयनोकॉस्ट ब्रिघम

FWIW, मैंने पाया कि यह sles 10 पर नहीं, बल्कि sles> = 11 पर है (इससे थोड़ा जल गया)
पीटर टर्नर

ध्यान दें कि यह वास्तव में सभी उदाहरण नहीं मिलता है। मेरे मामले में मेरे पास एक फाइल थी जो मेरे पास थी, -rw-r-xr-xजिसका -executableपता नहीं लगा
डीज़्ज़ा

2

इसने मेरे लिए काम किया और साझा करने के बारे में सोचा ...

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
केवल कुछ हजारों मामले अधिक हैं, और आपने नए सिरे से काम किया होगा file!
त्रिवेणी

@tripleee +1। कूल होगा यह विस्तार:find ./ -mime application/x-sharedlib -o -mime application/x-dosexec
डैनियल एल्डर

@ डैनियल एल्डर, आप किस संस्करण का उपयोग करते हैं? मुझे विकल्प नहीं मिला-खोज में (GNU findutils) 4.4.2
अजयकुमारबसुथकर

@tripleee +1। 'फ़ाइल' और 'mimetype' का उपयोग करना अच्छा विचार है या खोज संस्करण का पता लगाएं जो समर्थन करता है -Mime बेहतर है, यह भी सोचें कि क्या 'फ़ाइल' / 'mimetype' में केवल निष्पादन योग्य (एस) को फ़िल्टर और प्रदर्शित करने का विकल्प है।
अजयकुमारबसुतकर

2
find . -executable -type f

वास्तव में यह गारंटी नहीं देता है कि फ़ाइल निष्पादन योग्य है यह निष्पादन बिट सेट के साथ फ़ाइलें प्राप्त करेगा। यदि तुम करो

chmod a+x image.jpg

इसके बाद के संस्करण को लगता है कि image.jpg एक निष्पादन योग्य है, भले ही यह वास्तव में निष्पादन बिट सेट के साथ एक jpeg छवि है।

मैं आम तौर पर इस मुद्दे के साथ काम करता हूं:

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

यदि आप चाहते हैं कि वास्तव में निष्पादन योग्य फ़ाइलों के बारे में गुंबद की जानकारी को प्रिंट करें तो आप ऐसा कुछ कर सकते हैं:

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

उपरोक्त उदाहरण में फ़ाइल का पूर्ण पथनाम अंतिम फ़ील्ड में है और इसे प्रतिबिंबित करना चाहिए जहाँ आप इसे "NAME = $ (awk '{$ $ NF}' <<< $ LINE)" के साथ देखते हैं, यदि फ़ाइल का नाम कहीं और है खोज आउटपुट स्ट्रिंग आपको "एनएफ" को सही संख्यात्मक स्थिति से बदलने की आवश्यकता है। यदि आपका विभाजक स्थान नहीं है, तो आपको यह भी बताने की आवश्यकता है कि आपका विभाजक क्या है।


1

यह बहुत हास्यास्पद है कि यह सुपर-आसान नहीं है ... असंभव के बगल में अकेले चलो । हाथ ऊपर, मैं Apple के लिए defer / स्पॉटलाइट ...

mdfind 'kMDItemContentType=public.unix-executable'

कम से कम यह काम करता है!


mdfindOSX के बारे में जानने के लिए अच्छा है । ध्यान दें कि uour कमांड पूरे सिस्टम के लिए यूनिक्स एक्ज़िबिट की रिपोर्ट करता हैmdfind -onlyin . 'kMDItemContentType=public.unix-executable'वर्तमान निर्देशिका की सबट्री के परिणाम सीमित करता है। रुचि के मामूली बिंदु: केवल एक विशिष्ट निर्देशिका में खोज को सीमित करना (बिना सबफ़ोल्डर्स के) स्पष्ट रूप से समर्थित नहीं है। निष्पादन योग्य फ़ाइलों के लिए साइमलिंक स्पष्ट रूप से कभी शामिल नहीं होते हैं। उत्सुकता से, एक बार mdfindनिष्पादन योग्य होने के लिए एक फ़ाइल मिल गई है, बाद में निष्पादन योग्य बिट को हटाने से उठाया नहीं जाता है।
mklement0

मुझे लगता है कि मुझे यह पता चल गया है कि स्पॉटलाइट कैसे पता लगाता है / निष्पादन योग्य यूनिक्स की फाइलों को अनडिक्ट करता है; मैंने Apple के साथ बग दर्ज किया है, और Openradar.me/20162683 पर भी । मैं आपको प्रोत्साहित करता हूं - और इस कार्यक्षमता में रुचि रखने वाले - और भी
Bugreport.apple.com

(टिप्पणी के लिए खेद है, उम्मीद है कि वे अब सही हैं) mdfind -onlyin . 'kMDItemContentType=public.unix-executable'जैसा व्यवहार find . -type f -perm +111 -printकरता है। यही है, यह किसी भी निष्पादन योग्य बिट सेट के साथ फाइलें पाता है , जो झूठी सकारात्मकता पैदा कर सकता है (हालांकि यह व्यवहार में एक समस्या नहीं हो सकती है) - सही मायने में बीएसडी खोज का उपयोग करके वर्तमान उपयोगकर्ता द्वारा निष्पादन योग्य फ़ाइलों को खोजने के लिए, @ gniourf_gniff का जवाब देखें। एक- findआधारित समाधान का उपयोग करने से यह फायदा होता है कि आप निष्पादन योग्य फ़ाइलों के लिए सहानुभूति पा सकते हैं , यदि वांछित (विकल्प -L), जो mdfindप्रतीत नहीं होता है।
mklement0

1
@ mklement0 मेरे जवाब ने अलंकृत किया अलंकृत - कोशिश करने के लिए और बिंदु घर को नाखून देने के लिए - लेकिन हाँ, आप लगभग कभी भी इस रूप का उपयोग नहीं करेंगे "अनर्गल"। एक और विकल्प - निश्चित नहीं है कि अगर यह ऊपर आता है - क्या अच्छा पुराना ग्लोबिंग है .. ls /Applications/**/*(*)आपके (मेरे) zshशेल में
एलेक्स ग्रे

आसान zshटिप के लिए धन्यवाद - पता नहीं था कि; (ऐसा लगता है कि आप या तो निष्पादन योग्य मेल कर सकते हैं* ) ( या सहानुभूति @) ( ), लेकिन दोनों नहीं, सही?)। अपने मूल बिंदु के रूप में: मुझे दोहराएं: अधिक लचीलापन प्रदान करते हुए, find . -type f -perm +a=xआपकी mdfindआज्ञा क्या करेगी । आप इसे POSIX- अनुरूप होने के लिए भी सुधार कर सकते हैं।
mklement0

1

वैसे इसका आसान उत्तर यह होगा: "आपकी निष्पादन योग्य फाइलें आपके पैट वैरिएबल में निहित निर्देशिकाओं में हैं" लेकिन यह वास्तव में आपके निष्पादन योग्य नहीं पाएगी और वैसे भी बहुत सारे निष्पादन योग्य याद कर सकती हैं।

मुझे मैक के बारे में ज्यादा जानकारी नहीं है, लेकिन मुझे लगता है कि "mdfind 'kMDItemContentType = public.unix-execable'" सामान की तरह याद किया जा सकता है

यदि निष्पादन योग्य बिट सेट के साथ फाइल ढूंढना आपके लिए ठीक है (फिर चाहे वे वास्तव में निष्पादन योग्य हों) तो ऐसा करना ठीक है

find . -type f -perm +111 -print

जहाँ "-executable" विकल्प का समर्थन किया गया है वह एक और फिल्टर को acl और अन्य अनुमति वाली कलाकृतियों को देखेगा, लेकिन तकनीकी रूप से "-pemr +111" से बहुत भिन्न नहीं है।

हो सकता है कि भविष्य में खोज "-जीवन" का समर्थन करे और आपको एक विशिष्ट मैजिक आईडी वाली फाइलों के लिए स्पष्ट रूप से देखने दे ... लेकिन फिर आप सभी निष्पादन योग्य प्रारूप जादू आईडी को निर्दिष्ट करना चाहेंगे।

मैं यूनिक्स पर तकनीकी रूप से सही आसान तरीके से अनजान हूं।


1

इसलिए यदि आप वास्तव में निष्पादन योग्य फ़ाइल प्रकार (जैसे स्क्रिप्ट, ईएलएफ बायनेरी आदि) ढूंढना चाहते हैं .. तो केवल निष्पादन की अनुमति वाली फाइलें नहीं हैं तो आप शायद ऐसा कुछ और करना चाहते हैं (जहां वर्तमान निर्देशिका को प्रतिस्थापित किया जा सकता है। निर्देशिका जो आप चाहते हैं):

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

या आप में से जो macports (linux users) का उपयोग नहीं कर रहे हैं या अन्यथा आप चाहते हैं के रूप में gnu स्थापित पाया है:

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

यद्यपि यदि आप OS X पर हैं, तो यह is_exec नामक एक छोटी सी उपयोगिता के साथ आता है जिसे मूल रूप से is_exec कहा जाता है जो मूल रूप से आपके लिए उस छोटे परीक्षण को बंडल करता है ताकि आप इसे ढूंढने पर कमांड लाइन को छोटा कर सकें। लेकिन यह तरीका और अधिक लचीला है क्योंकि आप == परीक्षण को आसानी से बदल सकते हैं = ~ परीक्षण के साथ और इसका उपयोग निष्पादन योग्य सादे पाठ फ़ाइलों या जो भी अन्य जानकारी आपकी फ़ाइल कमांड रिटर्न के लिए और अधिक जटिल गुणों की जांच करने के लिए करते हैं।


यहाँ उद्धरण के लिए सटीक नियम बहुत अपारदर्शी हैं इसलिए मैं अभी इसे परीक्षण और त्रुटि के द्वारा समाप्त करना चाहता हूं लेकिन मुझे सही स्पष्टीकरण सुनना अच्छा लगेगा।


0

मेरे पास एक ही मुद्दा था, और उत्तर dmenu स्रोत कोड में था : उस उद्देश्य के लिए बनाई गई स्टैस्ट उपयोगिता। आप 'stest.c' और 'arg.h' फ़ाइलों को संकलित कर सकते हैं और यह काम करना चाहिए। उपयोग के लिए एक आदमी पृष्ठ है, जो मैंने वहां सुविधा के लिए रखा है:

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)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.