प्रत्येक मिलान फ़ाइल (यानी हर निर्देशिका) के लिए, 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'\')
man bash
"-c" के अंतर्गत: कमांड_string के बाद तर्क $ 0 से शुरू होने वाले स्थितीय मापदंडों को सौंपा गया है, हालांकि "d" के लिए $ 1 से शुरू होने वाले स्थितीय मापदंडों के माध्यम से पुनरावृत्ति होगी। "_" वह टेक्स्ट है जिसे $ 0 में असाइन किया गया है और इसका उपयोग नहीं किया जाएगा।