यदि कोई पथ नहीं दिया जाता है, तो प्रिंट को एक अग्रणी '/' क्यों कहा जाता है?


13

ऐसा क्यों है कि अगर कोई रास्ता नहीं दिया जाता है, तो परिणाम के लिए findएक प्रिंट होता है ./?

$ find
./file1
./file2
./file3

इसे न छापने का क्या कारण है?

$ find
file1
file2
file3

जवाबों:


16

आप इसे क्यों देखते हैं इसका कारण यह है कि जब कोई रास्ता नहीं दिया जाता है , तो 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 "."

11

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

एक उदाहरण के रूप में, इन फ़ाइलों के साथ एक निर्देशिका पर विचार करें:

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

1
यह समझ में आता है। लेकिन फिर यह सवाल है कि यह एक '' का संकेत क्यों नहीं देता। जब आप चलाने के find *
nr

@nr अच्छी बात है। मुझे उम्मीद है कि यह किसी तरह की ऐतिहासिक संगतता के लिए उस तरह का व्यवहार करता है। मैंने इसका एक उदाहरण उत्तर में जोड़ा कि यह अवांछनीय व्यवहार क्यों है।
जॉन 1024

3
कुछ संस्करण उपयोगकर्ता को रास्ता देने की file मांग करते हैं (जैसे बीएसडी ओएस एक्स पर पाते हैं)। इसलिए आपको आमतौर पर कुछ स्पष्ट रूप से कहने की आवश्यकता होती है find . -type f ...। वहाँ से, यह कुछ संस्करणों के लिए एक बड़ा कदम नहीं है (जैसे GNU खोज) बस डिफ़ॉल्ट के लिए .और बाकी सब कुछ उसी तरह छोड़ दें।
ilkachachu

1
find *नहीं दिखाने का कारण यह .है क्योंकि *सभी फ़ाइलों और फ़ोल्डरों को सूचीबद्ध करता है, लेकिन बाहर करता है .echo *एक निर्देशिका में करें जिसमें केवल एक या दो फाइलें हों, और आप देखेंगे कि .यह सूचीबद्ध नहीं है। इस प्रकार, find *विस्तारित प्रत्येक फ़ाइल पर काम करता है। यह वैसा ही है जैसा आपने find Desktop/होम डायरेक्टरी से कहा है। आप आउटपुट को इस तरह देखेंगेDesktop/foo_bar.txt
सर्गी कोलोडाज़नी

1
@ जॉन 1024: मेरा मानना ​​है कि मृगेश और थॉमस डिके ने सवाल का सही उत्तर दिया है। यह उत्तर बताता है कि यह सुविधाजनक क्यों है जो इसके findव्यवहार का तरीका बताता है। क्या आपके पास उस निहित दावे का समर्थन करने के लिए कोई आधिकारिक संदर्भ जानकारी है जो इस कारण सेfind इस तरह से व्यवहार करने के लिए डिज़ाइन किया गया था ?
जी-मैन का कहना है कि 'मोनिका'

4

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
एनआर

1
यह नहीं है कि "कहते हैं।" प्रारंभ में वास्तव में यह जोड़ता है कि आप इसे पथ के रूप में जो भी देते हैं, चाहे, वह "/ tmp" "abc" या "" हो। यह क्रमशः सभी मान लौटाएगा।
मृगेश प्रियदर्शी

-2

यदि आप कोई पथ निर्दिष्ट नहीं करते हैं, तो findकमांड ${PWD}उस पथ को मानता है और इसके आउटपुट पर प्रिंट करता है। पथ निर्दिष्ट नहीं करने वाला उपयोगकर्ता findकाम करने के तरीके को नहीं बदलता है । और हमेशा डिफ़ॉल्ट रूप से पथों के साथ काम करता है।


1
समझा। लेकिन अगर आप इसके तहत निष्पादित /tmp, तो $PWDहै /tmpनहीं ./
एनआर

यदि आप पूर्ववर्ती देखना चाहते हैं /tmp, तो कमांड चलाएं find /tmpयदि आप एक पथ निर्दिष्ट नहीं करते हैं तो यह हमेशा वर्तमान निर्देशिका होगी, जो है./
मेलबर्सलान

1
ऐसा नहीं है कि मैं आगे बढ़ना चाहता हूं /tmp। यह है कि यह नहीं हो सकता है $PWD
एनआर

मेरी माफी ${PWD}गलत
क्रिया थी

2
नहीं, यह $ PWD नहीं मानता है। के उत्पादन की तुलना करें find ., find $PWDऔर find(एक पथ के बिना, अगर आपका पता इसे समर्थन करता है)।
ilkachachu
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.