खोजने में क्या अंतर है। और ढूंढें । प्रिंट


27

के बीच क्या अंतर है:

find .

तथा

find . -print

-printवास्तव में क्या करता है?

$ find .
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt
$ find . -print
.
./hello.txt
./hello
./hello/txt
./hello/hello2
./hello/hello2/hello3
./hello/hello2/hello3/txt
./hello/hello2/txt

जवाबों:


41

से findutils findमैनपेज :

यदि कोई अभिव्यक्ति नहीं दी जाती है, तो अभिव्यक्ति -printका उपयोग किया जाता है (लेकिन आपको शायद -print0, इसके बजाय, वैसे भी उपयोग करने पर विचार करना चाहिए )।

( -printएक findअभिव्यक्ति है।)

POSIX प्रलेखन इस बात की पुष्टि करता:

यदि कोई अभिव्यक्ति मौजूद नहीं है, तो -प्रिंट अभिव्यक्ति के रूप में उपयोग किया जाएगा।

तो find .इसके बिल्कुल बराबर है find . -print; पहले की कोई अभिव्यक्ति नहीं है इसलिए -printआंतरिक रूप से जोड़ा जाता है।

-printमैनपेज में आगे क्या घटता है, इसकी व्याख्या :

-print

सच; मानक आउटपुट पर पूर्ण फ़ाइल नाम प्रिंट करें, उसके बाद एक नई पंक्ति। यदि आप किसी अन्य प्रोग्राम में खोज के आउटपुट को पाइप कर रहे हैं और इस बात की सबसे अधिक संभावना है कि आप जिन फ़ाइलों को खोज रहे हैं, उनमें एक नई पंक्ति हो सकती है, तो आपको गंभीरता से -print0विकल्प के बजाय विकल्प का उपयोग करना चाहिए -print। फ़ाइल नाम में असामान्य वर्णों को कैसे हैंडल किया जाता है, इसकी जानकारी के लिए UNUSUAL FILENAMES अनुभाग देखें।


शुरुआत स्तर के प्रश्न की तरह लेकिन आप किस अभिव्यक्ति के बारे में बात कर रहे हैं? क्या यह नियमित अभिव्यक्ति है?
ऋषि प्रकाश

2
@ ऋषि मैनपेज देखें ।
स्टीफन किट

20

-printडिफ़ॉल्ट क्रिया है । कुछ findविधेय को फ़िल्टर या शर्तों के विपरीत कार्यों के रूप में माना जाता है । उदाहरण के लिए, कोई क्रिया नहीं है। हालांकि यह एक शर्त के रूप में भी इस्तेमाल किया जा सकता है।-type f-exec

क्रियाओं में शामिल हैं -print, -execऔर -ok। कुछ findकार्यान्वयन की तरह अन्य गैर मानक कार्रवाई विधेय है -print0, -printf, -execdir, -okdir, -ls...

find files <some-predicates>

कहाँ से कोई भी <some-predicates>शामिल कार्यों के बराबर है:

find files \( <some-predicates> \) -print

(ऊपर दिए गए कोष्ठकों पर ध्यान दें जो कुछ -oऑपरेटर हैं तो महत्वपूर्ण हैं )।

जब संदेह होता है, तो सबसे अच्छा -printस्पष्ट रूप से -exec printf '%s\0' {} +(या -print0जहां उपलब्ध हो) का उपयोग करना है ताकि आउटपुट पोस्ट-प्रोसेस किया जा सके।

डिफ़ॉल्ट -printक्रिया POSIX द्वारा निर्दिष्ट की गई है। कुछ पुराने findकार्यान्वयनों के लिए एक स्पष्ट आवश्यकता होती है-print , लेकिन वे आमतौर पर आजकल जंगली में नहीं पाए जाते हैं।

यह भी ध्यान दें कि कुछ findक्रियान्वयन छूटने की अनुमति देते हैं files, जिस स्थिति में वे वर्तमान निर्देशिका में खोज करने के लिए डिफ़ॉल्ट होते हैं। यानी, उनके लिए,

find

के बराबर है

find .
find . -print

हालांकि यह मानक नहीं है, इसलिए सबसे अच्छा बचा जाता है।

स्पेक्ट्रम के अधिक वर्बोज़ (और उपयोगी) छोर पर, कुछ findकार्यान्वयन भी फ़ाइल पथ को एक -fविकल्प के रूप में तर्क के रूप में पारित करने की अनुमति देते हैं :

find -f "$file1" -f "$file2" -print

वे एकमात्र findकार्यान्वयन हैं जो मनमाने फ़ाइल पथों को पारित करने की अनुमति देते हैं find। अन्य कार्यान्वयन फ़ाइल पथों को स्वीकार नहीं कर सकते हैं जैसे !या -print... तो find "$file" -print(या यहां तक ​​कि find -- "$file" -print) मान लें $fileकि किसी findपूर्वगामी (या पहले मामले में विकल्प ) का नाम नहीं है ।

दुर्भाग्य से यह मानक नहीं है और न ही पोर्टेबल है।


यदि यह गैर-मानक है और सबसे अच्छा बचा जाता है तो इसे नाम क्यों दें?
इसहाक

@Isaac, क्योंकि वे आसान हो सकते हैं / संभव
टाइपोस हैं

8

वे समान हैं, वे दोनों वर्तमान निर्देशिका से पूरी निर्देशिका पदानुक्रम लिखते हैं।

POSIX से प्रलेखन प्राप्त करें :

निम्नलिखित आदेश समतुल्य हैं:

खोजो।

खोजो। प्रिंट


4

लिनक्स में, कोई अंतर नहीं है, लेकिन अन्य प्रणालियों (जैसे उदाहरण के लिए AIX) की आवश्यकता है -printयदि आप अपनी स्क्रीन पर प्रदर्शित कमांड का आउटपुट चाहते हैं।


3
फिर AIX के बहुत पुराने संस्करण होंगे। AIX 4.3 findको इसकी आवश्यकता नहीं है। AIX दशकों से POSIX अनुरूप है।
स्टीफन चेजेलस

3

कई वर्षों तक खोज कमांड में डिफ़ॉल्ट कार्रवाई नहीं थी। एक सामान्य त्रुटि अपने खोज आदेश में -प्रिंट विकल्प जोड़ने के लिए भूल रही थी। मैं आज भी इसे आदत से बाहर टाइप करता हूं।

लेकिन कुछ बिंदु पर इसे अब तक की डिफ़ॉल्ट कार्रवाई के रूप में जोड़ा गया find .और find . -printसमतुल्य है।


1

कभी-कभी -printस्पष्ट रूप से उपयोग करने के लिए यह उपयोगी होता है जब आप एक अन्य क्रिया कर रहे होते हैं तो फ़ाइल नाम उस क्रिया के रूप में प्रदर्शित होता है।

find . -print -delete

के समान होगा

rm -rfv *

जहां -printमेल खाती है करने के लिए -v। यदि आप शामिल नहीं करते हैं, -printतो फ़ाइल नाम प्रदर्शित नहीं होते हैं।

rmकमांड को और भी समान बनाने के लिए , इस बैश कमांड को पहले जारी करें

shopt -s dotglob

जो *मैच डॉट (छिपी हुई) फाइलें बना देगा।

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