एक बुनियादी गलत धारणा को साफ करने के लिए @ 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
); ध्यान दें कि \!
इसका उपयोग !
शेल इतिहास के विस्तार से बचाने के लिए उदाहरणों में किया जाता है
-a
AND (GNU खोजो और BSD खोजो अनुमति भी -and
)
-o
OR (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 और (ख) के लिए अपने आप को प्रतिबंधित अष्टाधारी मोड केवल, तुम सकता है का उपयोग कर के साथ दूर होने के साथ दोनों जीएनयू खोजने के लिए और बीएसडी पाते हैं, लेकिन यह एक अच्छा विचार नहीं है।+