-Exec का उपयोग करते समय आप फाइंड कमांड को फाइंड कमांड में कैसे आउटपुट करते हैं?


33

मैं पीडब्ल्यूडी के सभी उप-निर्देशिकाओं को खोजने के लिए और svnadmin verifyप्रत्येक निर्देशिका पर चलने के लिए निम्न पंक्ति का उपयोग करता हूं (मुझे पहले से पता है कि वे सबवर्सन उपयोगिताएँ हैं)

find ./* -maxdepth 0 -exec svnadmin verify {} \;

यह अच्छी तरह से काम करता है, इस तथ्य के अलावा कि आउटपुट इस तरह दिखता है:

* Verifying repository metadata ...
* Verifying metadata at revision 1 ...
* Verifying metadata at revision 2 ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 9 ...
* Verifying metadata at revision 10 ...
* Verifying metadata at revision 12 ...
* Verifying metadata at revision 14 ...
* Verifying metadata at revision 15 ...
* Verifying metadata at revision 18 ...
* Verifying metadata at revision 20 ...
* Verifying metadata at revision 22 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.
* Verified revision 10.
* Verified revision 11.
* Verified revision 12.
* Verified revision 13.
* Verified revision 14.
* Verified revision 15.
* Verified revision 16.
* Verified revision 17.
* Verified revision 18.
* Verified revision 19.
* Verified revision 20.
* Verified revision 21.
* Verified revision 22.
* Verified revision 23.
* Verified revision 0.
* Verifying repository metadata ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 7 ...
* Verifying metadata at revision 9 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.

मैं वास्तव findमें svnadmin verifyकमांड को निष्पादित करने से पहले फ़ाइल नाम प्रिंट करना चाहता हूं , लॉगिंग को आसान बनाने के लिए।

मैं lsवहाँ पर एक छोटे से निचोड़ने की कोशिश की है , लेकिन इसे चकमा दे दिया है, मुझे यह कैसे करना चाहिए (अधिमानतः बस)?

जवाबों:


36

बस -printfपहले एक विकल्प जोड़ें

find -printf '%p' -exec command \;

4
लवली, मैं इसीलिए बदल '%p'गया '%p\n'कि नाम की स्वयं की लाइन पर सत्यापित आउटपुट प्राप्त हो।
एरोनिकल जूल

17
@ एरोनिकल यदि आप चाहते हैं कि प्रारूप है, तो आप (स्वरूपित) -printf '%p\n'को सरल से बदल सकते हैं-print
Steeldriver

4
find -name <a_name> -print -exec command {} \;
टॉलिवेरा

14

यदि आप पुनरावृत्ति नहीं करना चाहते हैं, तो उपयोग करने का कोई मतलब नहीं है find। इसे सीधे शेल में करना कहीं अधिक सरल है:

for d in */; do echo "$d"; svnadmin verify "$d"; done

for d in */सभी निर्देशिकाओं (मिलेगा */सुनिश्चित केवल निर्देशिका और कोई भी फ़ाइलें पाए जाते हैं); echo "$d"निर्देशिका का नाम प्रिंट होगा; svnadmin verify "$d"निर्देशिका की जाँच करेगा।

इसे या तो कमांड लाइन से या स्क्रिप्ट के भीतर से प्रारूप में कोई बदलाव नहीं किया जा सकता है।


1
यह मेरे लक्ष्य को प्राप्त करने के लिए एक बेहतर तरीके की तरह दिखता है, लेकिन मुझे इसका जवाब फिक्समैन को सिर्फ इसलिए देना पड़ा क्योंकि मेरा शीर्षक और प्रश्न संदर्भ findइतना अधिक है। हालांकि मेरे ज्ञान में सुधार के लिए धन्यवाद!
एरोलॉजिकल

इसके लिए ग्लोब का इस्तेमाल करना पड़ता है। ग्लोबिंग निश्चित रूप से उपयोगी और शक्तिशाली है, लेकिन मेरे व्यक्तिगत अनुभव में सिंटैक्स को स्थापित करना अधिक कठिन है, और अक्सर अन्य चीजों की आवश्यकता होती है जैसे dotglobऔर globstarबैश में, जो एक लंबी, अधिक जटिल स्क्रिप्ट बनाता है। मैं बड़े जटिल कार्यों के लिए ग्लब्स को सहेजता हूं, जबकि findसिंटैक्स को फिल्टर के एक समूह में एक साथ स्ट्रिंग करके और एक-लाइनर में कमांड करके मक्खी पर एक साथ फेंकना आसान होता है।
user5359531

@ user5359531 न तो ग्लोबस्टार और न ही डॉटग्लोब (जब तक आप जानते हैं कि आपके पास छिपी हुई फाइलें हैं और वास्तव में उन्हें चाहते हैं) की आवश्यकता है। यह स्पष्ट रूप से राय की बात है, लेकिन आप पहले व्यक्ति हैं जो मैं कभी भी आया हूं जो findसरल के बजाय मोटे प्रारूप को मानता है। मैं हमेशा ग्लब्स को पसंद करता findहूं क्योंकि मैं न केवल उन्हें बहुत सरल लगता हूं, बल्कि अन्य कार्यक्रमों में जाने वाले मनमाने फिल्मनामों से निपटने के दौरान वे अधिक सुरक्षित होते हैं।
terdon

6
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

मैंने जोड़ा है -type dअगर यह केवल निर्देशिका है।


मैं बोली चाहते हैं {}, कम से कम मेंsvnadmin verify {}
Kos

शीघ्र प्रतिक्रिया के लिए धन्यवाद। तो इस कमांड में -execस्पॉन एक चाइल्ड शेल करता है, जिसमें 2 कमांड रन होते हैं, ;लाइन के अंत के रूप में?
एरॉनिकल जूल

5

इसे इस्तेमाल करे:

for f in * ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

यदि आप केवल निर्देशिका चाहते हैं (@kos नोट के लिए धन्यवाद):

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

अच्छा है, लेकिन यह भी फाइलों पर कार्रवाई करेंगे: for f in */केवल निर्देशिका पर कार्रवाई करेंगे
कोस

क्या यह केवल एक स्क्रिप्ट में काम करेगा? या मैं इसे कमांड लाइन पर जारी कर सकता हूं?
एरोनिकल जूल

1
@ एरॉनिकल कमांड लाइन के रूप में भी काम करेगा
मेथॉक्स

2
  • . -maxdepth 1इसके बजाय का उपयोग करें ./*, आपको फ़ोल्डर संरचना में केवल पहले स्तर की आवश्यकता है
  • उपयोग करें -type d, आपको केवल फ़ोल्डर्स की आवश्यकता है
  • का उपयोग करें ! -name ".", आप की जरूरत नहीं है.
  • -execएक खोल शुरू करने के लिए उपयोग करें
  • sh -cशेल के अंदर कमांड शुरू करने के लिए उपयोग करें

आपकी आज्ञा

find . -maxdepth 1 -type d ! -name "." -exec sh -c 'echo "{}"; svnadmin verify "{}"' \;

या कम है

  • का प्रयोग करें -pruneयदि फ़ाइल एक निर्देशिका है, यह में उतर नहीं है

आपकी आज्ञा

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 

-pruneदिलचस्प लग रहा है। मैं खोजने की आज्ञा ./* -maxdepth 0से लौटने .से बचता था। यह किसी भी महत्वपूर्ण त्रुटि का कारण नहीं बनता है, लेकिन मैं अपने आउटपुट में ऐसा नहीं करना पसंद करता हूं।
एरोनिकल जूल

1

findमुद्रण के लिए विकल्प झंडे हैं, जो पहले से ही अन्य उत्तरों में उल्लिखित हैं। यदि हम समस्या को देखते हैं तो वर्तमान में संसाधित फ़ाइल के लिए कई आदेशों को निष्पादित करने का परिप्रेक्ष्य बनाते हैं, findकई -execबयानों का उपयोग करने की अनुमति देता है । इसका मतलब है कि हम उपयोग करने का विकल्प चुन सकते हैं:

find ./* -maxdepth 0 -exec echo {} \; -exec svnadmin verify {} \; 

फिर, टिप्पणी है कि इस दृष्टिकोण के लिए बस के साथ मुद्रण नहीं लागू होता है echo, printfया अन्य उपयोगिताओं, बल्कि अन्य आदेशों।


0

लूप के findआउटपुट को पाइप करना उपयोगी हो सकता है read:

find . | while read d; do echo "=== ${d}: ==="; svnadmin verify ${d}; done

यह आपको findइस फैंसी lsउदाहरण में दिए गए फ़ाइलनाम के साथ अधिक जटिल, मिश्रित कमांड अनुक्रम को निष्पादित करने की अनुमति देता है :

find . | while read f; do echo ${f} | figlet -k; done

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