सभी उपनिर्देशिकाओं को पीछे छोड़ें और यूनिक्स शेल स्क्रिप्ट में कुछ करें


17

मैं चाहता हूं कि मेरी शेल स्क्रिप्ट एक मुख्य निर्देशिका में सभी उपनिर्देशिकाओं का दौरा करे। निर्देशिकाओं में कुछ करें, स्पूल फ़ाइल को आउटपुट भेजें और अगली निर्देशिका पर जाएं। मुख्य Dir = / tmp उप Dir = ABCD पर विचार करें (चार उप निर्देशिका)


2
ठीक है, कृपया हमें अपनी स्क्रिप्ट अभी तक दिखाएं। इसका कौन सा हिस्सा आपको परेशान कर रहा है?
terdon

जवाबों:


22

एक 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वह निर्देशिकाओं के प्रति सहानुभूति रखता है और छिपे लोगों को बाहर करता है)


1
कम से कम findउस तरह के आउटपुट को संसाधित करने से जुड़ी सीमाओं और जोखिमों को इंगित करें ।
स्टीफन चेज़लस

हाय ... मैं $ में घ के लिए लूप के लिए नीचे चलाने की कोशिश की (खोज / बैकअप / ASHISH -maxdepth 1 -type d) do ls -l | awk '{प्रिंट $ 9}' | grep CC * _ date +"%m%d20%Y"। Xargs गूंज $ d
आशीष

हाय ... मैंने लूप के लिए नीचे की कोशिश की। $ d में (ढूँढें / backup / ASHISH -maxdepth 1 -type d) do ls -l | awk '{print $ 9}' | grep CC * _ date +"%m%d20%Y"| xargs echo echo $ d अपेक्षित परिणाम सभी उप-निधियों में से ls -srr है। । उपरोक्त लूप काम नहीं कर रहा है
आशीष

1

मैं एक पूर्ण bashनौसिखिया हूं , लेकिन एक यूएन * एक्स अनुभवी। हालाँकि यह संदेह रहित है कि यह बैश शेल स्क्रिप्टिंग में किया जा सकता है, पुराने दिनों में हम find [-maxdepth <levels>] <start-dir> -exec <command> ;इसे हासिल करते थे। आप एक कर सकते हैं man findऔर चारों ओर खेल सकते हैं , शायद जब तक कोई आपको यह नहीं बताता कि यह कैसे करना है bash!


मैं बहुत चापलूसी कर रहा हूं कि मेरे "आउटलाइन" जवाब को यहां वोट मिला है। हालाँकि, नीचे @chaos के जवाब को डाउन-वोट क्यों मिला है? (इस बोर्ड में एक नवागंतुक के रूप में, मैं केवल अपने खुद के खिलाफ, उसके जवाब के खिलाफ यह टिप्पणी पोस्ट नहीं कर सकता।) उसका दूसरा सुझाव एक शेल स्क्रिप्ट समाधान के लिए सही है, और एक बाहरी findकमांड चलाने के ओवरहेड से बचा जाता है ।
जॉनब्रा

उनका दूसरा वास्तव में सही है। यदि निर्देशिका के नाम में व्हाट्सएप या विशेष वर्ण (उदाहरण के लिए बैकस्लैश) हैं तो उनका पहला विफल हो जाएगा। सुरक्षित संस्करण के लिए मैंने उनके उत्तर के लिए किया गया संपादन देखें।
terdon

मैं सहमत हूँ। यह उनका दूसरा, शेल-ओनली उत्तर था जिसकी मैं प्रशंसा कर रहा था।
जॉनब्रवे

मुझे पता है, मैं सिर्फ डाउनवोट (जिसे मैंने कास्ट नहीं किया था) समझा रहा था।
terdon


1

लगता है कि आप प्रत्येक उपखंड के तहत फ़ाइल नाम चाहते हैं; ls -l | awkमजबूत पर्याप्त, क्या हुआ अगर उन फ़ाइल नाम खाली स्थान के और / या नई पंक्तियां शामिल के लिए नहीं है? नीचे findयह भी काम करेगा findकि एस के -maxdepthलिए उनके लिए जा रहा है:

find . ! -name . -type d -prune -exec sh -c '
   cd "$1" && \
   find "." ! -name . -prune  -type f
' {} {} \;

0

मुझे हल मिल गया। नीचे दिया गया आदेश मेरी आवश्यकताओं को पूरा करता है।

find . -maxdepth 1 -type d \( ! -name . \) -exec bash -c "cd '{}' && ls -l |awk '{ print $9 }' |grep `date +"%m%d%Y"`|xargs echo" \;

0

यह 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 '\.$'

इन उदाहरणों को छिपी निर्देशिकाओं को वापस करने और मूल और वर्तमान निर्देशिकाओं को बाहर करने पर ध्यान देना महत्वपूर्ण हो सकता है


1
(1)  lsएक फाइल प्रति पंक्ति ( -1विकल्प क्या निर्दिष्ट करता है) डिफ़ॉल्ट रूप से लिखता है जब मानक आउटपुट एक पाइप होता है (इसलिए यह आपके उत्तरों में बहुत ही कम है)। (2) का आउटपुट पार्स करना lsएक बुरा विचार है - इसे और इसे देखें । आपका पहला उत्तर विफल हो जाएगा यदि निर्देशिकाओं के नाम में रिक्त स्थान (या नईलाइन्स) हैं, और यदि उनके नाम में नई सूचियाँ हैं तो सभी विफल हो जाएँगी। (3) आपको हमेशा शेल वेरिएबल (जैसे "$dir") का उद्धरण देना चाहिए जब तक कि आपके पास कोई अच्छा कारण न हो, और आपको यकीन है कि आप जानते हैं कि आप क्या कर रहे हैं।
स्कॉट

अच्छा अंक स्कॉट। जवाब को छोड़ दें, जैसे कि बिना नाम वाले डायरियों के बिना कई प्रणालियों के लिए, मुझे लगता है कि यह अभी भी एक के लिए उपयोगी हो सकता है।
23 अगस्त को JGurtz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.