जवाबों:
आप इसे क्यों देखते हैं इसका कारण यह है कि जब कोई रास्ता नहीं दिया जाता है , तो GNU के डेवलपर ने "उचित" व्यवहार प्रदान करने के लिए चुना । इसके विपरीत, POSIX यह नहीं बताता कि पैरामीटर वैकल्पिक है:find
find
find
उपयोगिता रिकर्सिवली से निर्देशिका पदानुक्रम उतर जाएगा पथ द्वारा निर्दिष्ट प्रत्येक फ़ाइल , एक बूलियन का सामना करना पड़ा प्रत्येक फ़ाइल के लिए ऑपरेंड अनुभाग में वर्णित प्राइमरी से बना अभिव्यक्ति का मूल्यांकन। प्रत्येक पथ संचालन का मूल्यांकन किया जाएगा क्योंकि यह सभी अनुगामी<slash>
पात्रों सहित प्रदान किया गया था ; पदानुक्रम में आई अन्य फ़ाइलों के लिए सभी pathnames होंगे संयोजन वर्तमान पथ संकार्य, एक की<slash>
वर्तमान पथ संकार्य एक में खत्म नहीं हुई हैं, और पथ के लिए फ़ाइल नाम रिश्तेदार संकार्य। संबंधित भाग में कोई डॉट या डॉट-डॉट घटक नहीं होंगे, कोई अनुगामी नहीं<slash>
पथ नाम घटकों के बीच वर्ण, और केवल एकल वर्ण।
आप प्रत्येक के लिए सारांश में अंतर देख सकते हैं। GNU में (कोष्ठक के रूप में) चौकोर कोष्ठक में वैकल्पिक वस्तुएँ हैं:
find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...]
[expression]
जबकि POSIX इंगित नहीं करता है कि यह वैकल्पिक हो सकता है:
find [-H|-L] path... [operand_expression...]
GNU कार्यक्रम में, यह किया गया है ftsfind.c
:
अगर (खाली) { / * * हम यहां एक अस्थायी चर का उपयोग करते हैं क्योंकि कुछ क्रियाएं संशोधित होती हैं * अस्थायी रूप से पथ। इसलिए यदि हम एक स्ट्रिंग स्थिरांक का उपयोग करते हैं, * हम एक coredump मिलता है। इसका सबसे अच्छा उदाहरण अगर हम कहें * "-प्रिंटf% H" (ध्यान दें, "नहीं खोजें। -printf% H")। * / char defaultpath [2] = ";" वापसी खोजें (डिफ़ॉल्टपथ); }
और एक शाब्दिक "."
सरलता के लिए प्रयोग किया जाता है। तो आप उसी परिणाम को देखेंगे
find
तथा
find .
क्योंकि (और POSIX सहमत है) दिए गए पथ का उपयोग परिणामों को उपसर्ग करने के लिए किया जाएगा ( संक्षेपण के लिए ऊपर देखें )।
एक छोटे से काम के साथ, कोई यह निर्धारित कर सकता है कि पहली बार फीचर कब जोड़ा गया था; यह 1996 में "खोजपत्र" के प्रारंभिक निर्माण में मौजूद था (देखें find.c
):
+ /* If no paths are given, default to ".". */
+ for (i = 1; i < argc && strchr ("-!(),", argv[i][0]) == NULL; i++)
+ process_top_path (argv[i]);
+ if (i == 1)
+ process_top_path (".");
+
+ exit (exit_status);
+}
3.8 खोजने के लिए चैंज से, यह स्पष्ट रूप से था
Sat Dec 15 19:01:12 1990 David J. MacKenzie (djm at egypt)
* find.c (main), util.c (usage): Make directory args optional,
defaulting to "."
आमतौर पर, कोई फाइलों का पोस्ट-प्रोसेसिंग करता है और उस स्थिति में, फ़ाइल नाम शुरू करने के लिए एक बड़ा लाभ हो सकता है ./
। विशेष रूप से, यदि एक फ़ाइल नाम के साथ शुरू होता है -
, तो एक बाद की कमांड उस फ़ाइलनाम को एक विकल्प की व्याख्या कर सकती है। ./
उससे बचता है।
एक उदाहरण के रूप में, इन फ़ाइलों के साथ एक निर्देशिका पर विचार करें:
$ ls
--link --no-clobber
अब, कल्पना करें कि यदि ./
सामने बिना फ़ाइल नाम प्रदान किए यह काम कैसे करेगा :
$ find -type f -exec cp -t ../ {} +
हम find
स्वयं के साथ समस्या का वर्णन कर सकते हैं । इसे ऊपर की तरह उसी डायरेक्टरी में चलाते हैं। निम्नलिखित कार्य:
$ find ./*
./--link
./--no-clobber
निम्नलिखित विफल रहता है:
$ find *
find: unknown predicate `--link'
Try 'find --help' for more information.
file
मांग करते हैं (जैसे बीएसडी ओएस एक्स पर पाते हैं)। इसलिए आपको आमतौर पर कुछ स्पष्ट रूप से कहने की आवश्यकता होती है find . -type f ...
। वहाँ से, यह कुछ संस्करणों के लिए एक बड़ा कदम नहीं है (जैसे GNU खोज) बस डिफ़ॉल्ट के लिए .
और बाकी सब कुछ उसी तरह छोड़ दें।
find *
नहीं दिखाने का कारण यह .
है क्योंकि *
सभी फ़ाइलों और फ़ोल्डरों को सूचीबद्ध करता है, लेकिन बाहर करता है .
। echo *
एक निर्देशिका में करें जिसमें केवल एक या दो फाइलें हों, और आप देखेंगे कि .
यह सूचीबद्ध नहीं है। इस प्रकार, find *
विस्तारित प्रत्येक फ़ाइल पर काम करता है। यह वैसा ही है जैसा आपने find Desktop/
होम डायरेक्टरी से कहा है। आप आउटपुट को इस तरह देखेंगेDesktop/foo_bar.txt
find
व्यवहार का तरीका बताता है। क्या आपके पास उस निहित दावे का समर्थन करने के लिए कोई आधिकारिक संदर्भ जानकारी है जो इस कारण सेfind
इस तरह से व्यवहार करने के लिए डिज़ाइन किया गया था ?
find
आदेश की जरूरत पथ (रों) खोज करने के लिए। यदि हम कोई निर्दिष्ट नहीं करते हैं, तो यह वर्तमान निर्देशिका ( .
) को इसके शुरुआती बिंदु के रूप में उपयोग करता है । इसी तरह, यदि आप मार्ग को पार करते हैं, उदाहरण के लिए /tmp
, यह मानता है कि इसका प्रारंभिक बिंदु है। और इसलिए परिणाम।
यदि वर्तमान निर्देशिका:
$ find
or
$ find .
output:
./file1
./file2
./file3
यदि /tmp
निर्देशिका:
$ find /tmp
output:
/tmp/file4
/tmp/file5
यदि abc
वर्तमान निर्देशिका के अंतर्गत निर्देशिका:
$ find abc
output:
abc/file6
abc/file7
यदि वर्तमान निर्देशिका के अंतर्गत कई निर्देशिकाएँ:
$ find fu bar
output:
fu/file10
fu/file11
bar/file8
bar/file9
find
कि कुछ भी खोज करने के लिए एक मार्ग की आवश्यकता है और यह वर्तमान निर्देशिका के लिए चूक है। सवाल यह है कि यह क्यों प्रमुख प्रिंट करता है ./
जब file.txt
बस के रूप में ही है ./file.txt
।
यदि आप कोई पथ निर्दिष्ट नहीं करते हैं, तो find
कमांड ${PWD}
उस पथ को मानता है और इसके आउटपुट पर प्रिंट करता है। पथ निर्दिष्ट नहीं करने वाला उपयोगकर्ता find
काम करने के तरीके को नहीं बदलता है । और हमेशा डिफ़ॉल्ट रूप से पथों के साथ काम करता है।
/tmp
, तो $PWD
है /tmp
नहीं ./
।
/tmp
, तो कमांड चलाएं find /tmp
यदि आप एक पथ निर्दिष्ट नहीं करते हैं तो यह हमेशा वर्तमान निर्देशिका होगी, जो है./
/tmp
। यह है कि यह नहीं हो सकता है $PWD
।
${PWD}
गलत
find .
, find $PWD
और find
(एक पथ के बिना, अगर आपका पता इसे समर्थन करता है)।
find *
।