एक फ़ोल्डर और सूची फ़ाइलों के माध्यम से लूप


14

मेरे पास 'नमूना' नाम का एक फ़ोल्डर है और इसमें 3 फाइलें हैं। मैं एक शेल स्क्रिप्ट लिखना चाहता हूं जो नमूना फ़ोल्डर के अंदर इन फ़ाइलों को पढ़ेगी और इसे कर्ल का उपयोग करके एक HTTP साइट पर पोस्ट करेगी।

मैंने फ़ोल्डर के अंदर फाइलों को सूचीबद्ध करने के लिए निम्नलिखित लिखा है:

for dir in sample/*; do
        echo $dir;
        done

लेकिन यह मुझे निम्न आउटपुट देता है:

sample/log

sample/clk

sample/demo

यह इसमें पैरेंट फोल्डर को अटैच कर रहा है। मुझे आउटपुट निम्नानुसार चाहिए (मूल फ़ोल्डर नाम के बिना)

log

clk

demo

मैं यह कैसे करु?


1
पहले 'सीडी' का उपयोग करें। यदि आपको 'कर्ल' की आवश्यकता है, तो आपको अभी भी निर्देशिका दर्ज करने की आवश्यकता है। इसके अलावा, आप echo ${dir##*/}रास्ते से हटाने के लिए उपयोग कर सकते हैं ।
eexpress

जवाबों:


32

का प्रयोग करें basenameफाइल के बंद अग्रणी पथ पट्टी:

for file in sample/*; do
    echo "$(basename "$file")"
done

हालांकि क्यों नहीं:

( cd sample; ls )

3

अपने शेल को मानते हुए इसका समर्थन करता है कि आप पैरामीटर विस्तार का उपयोग कर सकते हैं

for path in sample/*; do
    printf -- '%s\n' "${path##*/}"
done

या आप बस उस निर्देशिका को बदल सकते हैं और वहां लिस्टिंग कर सकते हैं


1
--यहाँ की जरूरत नहीं है। पहला तर्क एक निश्चित स्ट्रिंग है जिसमें कोई डैश नहीं है।
कुसलानंद '29

इसके अलावा, ${parameter##pattern}सभी POSIX गोले द्वारा समर्थित है।
Kusalananda

2

क्योंकि * निक्स सिस्टम लगभग किसी भी चरित्र को एक फ़ाइलनाम का हिस्सा बनाने की अनुमति देता है (व्हॉट्सएप, न्यूलाइन, कॉमा, पाइप प्रतीकों आदि सहित), आपको शेल स्क्रिप्ट में "ls" कमांड के आउटपुट को पार्स नहीं करना चाहिए। यह विश्वसनीय नहीं है। देखें कि आपको ls के आउटपुट को पार्स क्यों नहीं करना चाहिए

फ़ाइलों की सूची बनाने के लिए "ढूंढें" का उपयोग करें। यदि आप बैश का उपयोग कर रहे हैं, तो आप एक सरणी में "खोज" का आउटपुट डाल सकते हैं। नीचे दिए गए उदाहरण, कैविएट के साथ कि मैंने एक गैर-कार्यशील "कर्ल" कमांड का उपयोग किया है!

searchDir="sample/"
oldFiles=()
while IFS= read -r -d $'\0' foundFile; do
    oldFiles+=("$foundFile")
done < <(find "$searchDir" -maxdepth 1 -type f -print0 2> /dev/null)

if [[ ${#oldFiles[@]} -ne 0 ]]; then
    for file in "${oldFiles[@]}"; do
        curl -F data=@"$file" UPLOAD_ADDRESS
    done
fi

यहाँ निर्देशिका क्या है? $ '\ _'? मैं एक निर्देशिका को पारित करना चाहता हूं जो एक चर में है ...
सोयालेन ग्राहम

searchDir निर्देशिका चर है। "-d $ '\ 0'" रीड कमांड के सीमांकक को अशक्त करने के लिए सेट करता है।
bb_referee

मैं एक शेल में एक ही चीज कैसे प्राप्त करूं? मैं #! / बिन / श
आयुष्मान जूल

1

यह निर्भर करता है कि आप निर्देशिकाओं के साथ क्या करना चाहते हैं।

बिना किसी चेक के बस नाम छापने के लिए, क्या यह वह निर्देशिका है जिसका आप ls उपयोग कर सकते हैं:

ls -1 sample

बेहतर होगा, क्योंकि आप फ़िल्टर का उपयोग कर सकते हैं:

find sample -type d -maxdepth 1 -printf '%f\n'

यदि आप फ़ाइलों पर कमांड चलाना चाहते हैं, तो आपको लूप के लिए फाइंड का उपयोग करना चाहिए न कि:

find sample -type d -maxdepth 1 -exec basename {} \;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.