-execdir के साथ खोजें


16

जब मैं चलाने के findसाथ -execdirमैं परिणाम मैं उम्मीद कर रहा था नहीं मिलता है।

उदाहरण के लिए:

mkdir -p a/b/c
find . -type d -execdir touch foo \;
$ tree a
a
├── b
   ├── c
   └── foo
└── foo

निर्देशिका में फ़ाइल cनहीं है foo। मुझे findप्रत्येक निर्देशिका में स्थानीय रूप से यात्रा करने और कुछ करने के लिए कैसे मिलता है?

जवाबों:


18

प्रत्येक मिलान फ़ाइल (यानी हर निर्देशिका) के लिए, findउस निर्देशिका में स्विच किया जाता है जिसमें यह (यानी इसकी मूल निर्देशिका) होती है और निर्दिष्ट कमांड निष्पादित होती है। चूंकि कमांड मैच के नाम का उपयोग नहीं करता है, यह सभी निर्देशिकाओं पर कार्य करने वाला नहीं है। इस विशेष निर्देशिका ट्री के लिए, आप कर रहे हैं

(cd . && touch foo)        # because ./a matches
(cd ./a && touch foo)      # because ./a/b matches
(cd ./a/b && touch foo)    # because ./a/b/c matches

हर निर्देशिका में एक फ़ाइल बनाने के लिए, आप -execइसके बजाय बस का उपयोग कर सकते हैं -execdir, बशर्ते आपके तर्क को एक तर्क के अंदर लागू करने की findअनुमति दी जाए {}(सबसे अधिक, और विशेष रूप से मुझे लगता है कि सभी लोग):

find . -type d -exec touch {}/foo +

POSIX पोर्टेबिलिटी के लिए, आपको निर्देशिका नाम और फ़ाइल आधार नाम की कोडांतरण मैन्युअल रूप से करने की आवश्यकता होगी।

find . -type d -exec sh -c 'touch "$0/foo"' {} \;

या (थोड़ा तेज)

find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +

वैकल्पिक रूप से, आप बैश के पुनरावर्ती वाइल्डकार्ड मिलान का उपयोग कर सकते हैं। खबरदार कि (ksh और zsh में संबंधित सुविधा के विपरीत, और आपकी findआज्ञा के विपरीत ) निर्देशिकाओं के प्रतीकात्मक लिंक के तहत पुनरावर्ती करता है।

shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done

एक zsh समाधान:

touch ./**/(e\''REPLY+=foo'\')

FYI करें: man bash"-c" के अंतर्गत: कमांड_string के बाद तर्क $ 0 से शुरू होने वाले स्थितीय मापदंडों को सौंपा गया है, हालांकि "d" के लिए $ 1 से शुरू होने वाले स्थितीय मापदंडों के माध्यम से पुनरावृत्ति होगी। "_" वह टेक्स्ट है जिसे $ 0 में असाइन किया गया है और इसका उपयोग नहीं किया जाएगा।
चाड स्कीटर

3

कमांड हर निर्देशिका में निष्पादित होती है जिसमें एक मिलान की गई फ़ाइल होती है। चूंकि cइसमें कोई निर्देशिका नहीं है, यह मेल नहीं खाता है और इस प्रकार वहां नहीं चलाया जाएगा।

समाधान निर्देशिका नाम को निष्पादित तर्क में जोड़ना है, जैसे:

find . -type d -execdir touch {}/foo \;

2

से man file

   -execdir command {} +
          Like  -exec,  but  the  specified  command is run from the subdirectory containing the matched file

आपकी मिलान निर्देशिका cउस bनिर्देशिका में रहती है, जिससे निष्पादन निष्पादित होता है। यदि आप निर्देशिकाओं के बजाय फ़ाइलों की तलाश कर रहे हैं तो यह आपकी अपेक्षा के अनुरूप काम करेगा।

आप संभवत: निर्देशिकाओं को भेजकर हासिल कर सकते हैं क्योंकि निर्देशिकाओं xargsकी पूरी सूची की आपूर्ति की जाएगी।

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