TL; DR: यदि आप यहाँ सबसे सही उत्तर के लिए हैं, तो आप शायद मेरी व्यक्तिगत पसंद चाहते हैं, find . -name '*.txt' -exec process {} \;
(इस पोस्ट के नीचे देखें)। यदि आपके पास समय है, तो कई अलग-अलग तरीकों और उनमें से अधिकांश के साथ समस्याओं को देखने के लिए बाकी के माध्यम से पढ़ें।
पूरा जवाब:
सबसे अच्छा तरीका इस बात पर निर्भर करता है कि आप क्या करना चाहते हैं, लेकिन यहां कुछ विकल्प हैं। जब तक सबट्री में किसी फाइल या फोल्डर में व्हाट्सएप न हो, तब तक आप फाइलों पर सिर्फ लूप कर सकते हैं:
for i in $x; do # Not recommended, will break on whitespace
process "$i"
done
मार्जिन बेहतर, अस्थायी चर को काटें x
:
for i in $(find -name \*.txt); do # Not recommended, will break on whitespace
process "$i"
done
जब आप कर सकते हैं तो यह बहुत बेहतर है। सफ़ेद-स्थान सुरक्षित, वर्तमान निर्देशिका में फ़ाइलों के लिए:
for i in *.txt; do # Whitespace-safe but not recursive.
process "$i"
done
globstar
विकल्प को सक्षम करके , आप इस निर्देशिका और सभी उपनिर्देशिकाओं में सभी मेल खाने वाली फ़ाइलों को ग्लोब कर सकते हैं:
# Make sure globstar is enabled
shopt -s globstar
for i in **/*.txt; do # Whitespace-safe and recursive
process "$i"
done
कुछ मामलों में, उदाहरण के लिए यदि फ़ाइल नाम पहले से ही एक फ़ाइल में हैं, तो आपको उपयोग करने की आवश्यकता हो सकती है read
:
# IFS= makes sure it doesn't trim leading and trailing whitespace
# -r prevents interpretation of \ escapes.
while IFS= read -r line; do # Whitespace-safe EXCEPT newlines
process "$line"
done < filename
read
find
उचित रूप से सीमांकक की स्थापना के साथ संयोजन में सुरक्षित रूप से इस्तेमाल किया जा सकता है:
find . -name '*.txt' -print0 |
while IFS= read -r -d '' line; do
process "$line"
done
अधिक जटिल खोजों के लिए, आप संभवतः find
इसका -exec
विकल्प या इसके साथ उपयोग करना चाहेंगे -print0 | xargs -0
:
# execute `process` once for each file
find . -name \*.txt -exec process {} \;
# execute `process` once with all the files as arguments*:
find . -name \*.txt -exec process {} +
# using xargs*
find . -name \*.txt -print0 | xargs -0 process
# using xargs with arguments after each filename (implies one run per filename)
find . -name \*.txt -print0 | xargs -0 -I{} process {} argument
find
भी कर सकते हैं प्रत्येक फ़ाइल की निर्देशिका में सीडी का उपयोग करके एक कमांड चलाने से पहले -execdir
के बजाय -exec
, और इंटरैक्टिव बनाया जा सकता है (प्रत्येक फ़ाइल के लिए आदेश चलाने से पहले शीघ्र) का उपयोग कर -ok
के बजाय -exec
(या -okdir
के बजाय -execdir
)।
*: तकनीकी रूप से, दोनों find
और xargs
(डिफ़ॉल्ट रूप से) कमांड को उतने ही तर्कों के साथ चलाएंगे, जितना वे कमांड लाइन पर फिट हो सकते हैं, जितनी बार सभी फाइलों के माध्यम से प्राप्त करने में लगता है। व्यवहार में, जब तक कि आपके पास बहुत बड़ी संख्या में फाइलें नहीं होंगी, और यदि आप लंबाई को पार करते हैं, लेकिन एक ही कमांड लाइन पर उन सभी की आवश्यकता होती है, तो आप SOL का एक अलग तरीका खोज लेंगे ।