मैं चाहता हूं कि मेरी शेल स्क्रिप्ट एक मुख्य निर्देशिका में सभी उपनिर्देशिकाओं का दौरा करे। निर्देशिकाओं में कुछ करें, स्पूल फ़ाइल को आउटपुट भेजें और अगली निर्देशिका पर जाएं। मुख्य Dir = / tmp उप Dir = ABCD पर विचार करें (चार उप निर्देशिका)
मैं चाहता हूं कि मेरी शेल स्क्रिप्ट एक मुख्य निर्देशिका में सभी उपनिर्देशिकाओं का दौरा करे। निर्देशिकाओं में कुछ करें, स्पूल फ़ाइल को आउटपुट भेजें और अगली निर्देशिका पर जाएं। मुख्य Dir = / tmp उप Dir = ABCD पर विचार करें (चार उप निर्देशिका)
जवाबों:
एक forलूप का उपयोग करें :
for d in $(find /path/to/dir -maxdepth 1 -type d)
do
#Do something, the directory is accessible with $d:
echo $d
done >output_file
यह निर्देशिका की केवल उपनिर्देशिका खोजता है /path/to/dir। ध्यान दें कि यदि निर्देशिका नाम में व्हाट्सएप या विशेष वर्ण हैं तो उपरोक्त सरल उदाहरण विफल हो जाएगा। एक सुरक्षित दृष्टिकोण है:
find /tmp -maxdepth 1 -type d -print0 |
while IFS= read -rd '' dir; do echo "$dir"; done
या सादे में bash:
for d in /path/to/dir/*; do
if [ -d "$d" ]; then
echo "$d"
fi
done
(ध्यान दें कि जो इसके विपरीत है, findवह निर्देशिकाओं के प्रति सहानुभूति रखता है और छिपे लोगों को बाहर करता है)
findउस तरह के आउटपुट को संसाधित करने से जुड़ी सीमाओं और जोखिमों को इंगित करें ।
date +"%m%d20%Y"। Xargs गूंज $ d
date +"%m%d20%Y"| xargs echo echo $ d अपेक्षित परिणाम सभी उप-निधियों में से ls -srr है। । उपरोक्त लूप काम नहीं कर रहा है
मैं एक पूर्ण bashनौसिखिया हूं , लेकिन एक यूएन * एक्स अनुभवी। हालाँकि यह संदेह रहित है कि यह बैश शेल स्क्रिप्टिंग में किया जा सकता है, पुराने दिनों में हम find [-maxdepth <levels>] <start-dir> -exec <command> ;इसे हासिल करते थे। आप एक कर सकते हैं man findऔर चारों ओर खेल सकते हैं , शायद जब तक कोई आपको यह नहीं बताता कि यह कैसे करना है bash!
findकमांड चलाने के ओवरहेड से बचा जाता है ।
$(find...)बात यह है कि खराब व्यवहार का ।
लगता है कि आप प्रत्येक उपखंड के तहत फ़ाइल नाम चाहते हैं; ls -l | awkमजबूत पर्याप्त, क्या हुआ अगर उन फ़ाइल नाम खाली स्थान के और / या नई पंक्तियां शामिल के लिए नहीं है? नीचे findयह भी काम करेगा findकि एस के -maxdepthलिए उनके लिए जा रहा है:
find . ! -name . -type d -prune -exec sh -c '
cd "$1" && \
find "." ! -name . -prune -type f
' {} {} \;
यह ls, grep और tr का उपयोग करके भी संभव है
for dir in $(ls -1FA | grep / | tr -d /); do echo $dir/something; done
ls -1FA | grep / | tr -d / | while IFS= read -r TD; do echo $TD/something; done
यदि आपके ls में उपरोक्त विकल्पों का अभाव है, तो du / sed का चयनकर्ता के रूप में भी उपयोग किया जा सकता है
du --max-depth=1 | sed -e 's/^.*\.\///' | grep -v '\.$'
इन उदाहरणों को छिपी निर्देशिकाओं को वापस करने और मूल और वर्तमान निर्देशिकाओं को बाहर करने पर ध्यान देना महत्वपूर्ण हो सकता है
lsएक फाइल प्रति पंक्ति ( -1विकल्प क्या निर्दिष्ट करता है) डिफ़ॉल्ट रूप से लिखता है जब मानक आउटपुट एक पाइप होता है (इसलिए यह आपके उत्तरों में बहुत ही कम है)। (2) का आउटपुट पार्स करना lsएक बुरा विचार है - इसे और इसे देखें । आपका पहला उत्तर विफल हो जाएगा यदि निर्देशिकाओं के नाम में रिक्त स्थान (या नईलाइन्स) हैं, और यदि उनके नाम में नई सूचियाँ हैं तो सभी विफल हो जाएँगी। (3) आपको हमेशा शेल वेरिएबल (जैसे "$dir") का उद्धरण देना चाहिए जब तक कि आपके पास कोई अच्छा कारण न हो, और आपको यकीन है कि आप जानते हैं कि आप क्या कर रहे हैं।