2012-12-07 13 views
28

मैं एक फ़ाइल (list.txt कहा जाता है कहते हैं) है कि फ़ाइलों के लिए संबंधित पथ, प्रति पंक्ति एक पथ, इस तरह यानी कुछ शामिल है:उबंटू बैश स्क्रिप्ट: अंतिम स्लैश द्वारा पथ को कैसे विभाजित करें?

foo/bar/file1 
foo/bar/baz/file2 
goo/file3 

मैं एक bash स्क्रिप्ट कि एक समय में एक पथ प्रक्रियाओं लिखने के लिए की जरूरत है, इसे अंतिम स्लैश पर विभाजित करता है और फिर तर्क के रूप में पथ के दो टुकड़ों को खिलाकर एक और प्रक्रिया शुरू करता है।

for p in `cat list.txt` 
do 
    # split $p like "foo/bar/file1" into "foo/bar/" as part1 and "file1" as part2 
    inner_process.sh $part1 $part2 
done 

मैं कैसे विभाजित हो जाते हैं: अब तक मैं केवल पाशन हिस्सा है? जब पथ में कोई कमी नहीं होती है तो क्या यह अपमानजनक मामले में काम करेगा?

Thx

उत्तर

65

basename और dirname का प्रयोग करें, कि आप सभी की जरूरत है।

part1=`dirname "$p"` 
part2=`basename "$p"` 
+0

यह वास्तव में "part1 =' dirname $ p'/"है क्योंकि मुझे अंतिम स्लैश चाहिए, लेकिन इसके अलावा यह सही है :-) –

+3

जैसे ही फ़ाइल नाम में एक स्थान या मजाकिया प्रतीक होते हैं, यह दुर्भाग्य से टूट जाएगा .. । ':-(' –

+1

सह टूटने के लिए इस तरह का टूटना छोटा है urse: 'part1 =" $ (dirname "$ p") "' और 'part2 =" $ (बेसनाम "$ p") "' – zenaan

11

एक उचित 100% बैश तरह से और जो फ़ाइल नाम है कि रिक्त स्थान या अजीब प्रतीकों के बारे में सुरक्षित है (बशर्ते inner_process.sh उन्हें सही ढंग से संभालती है, लेकिन यह एक और कहानी है):

while read -r p; do 
    [[ "$p" == */* ]] || p="./$p" 
    inner_process.sh "${p%/*}" "${p##*/}" 
done < list.txt 

और यदि ऐसा नहीं होता प्रत्येक फ़ाइल के लिए कांटा dirname और basename (सबहेल्स में)।

लाइन [[ "$p" == */* ]] || p="./$p" लाइन $p में कोई स्लैश नहीं है, तो यह ./ पर इसे प्रस्तुत करता है।

% और ## प्रतीकों के बारे में अधिक जानकारी के लिए Bash Reference Manual में Shell Parameter Expansion अनुभाग देखें।

-3

फ़ाइल एक्सटेंशन को एक्सएमएल में ढूंढने और बदलने के लिए यहां एक उदाहरण दिया गया है। यह छोटे और सरल (यदि नहीं के रूप में कुशल) रखते हुए

for files in $(ls); do 

    filelist=$(echo $files |cut -f 1 -d "."); 
    mv $files $filelist.xml; 
done 
+4

कभी भी विश्लेषण नहीं करता है। [सीखने के लिए यहां देखें क्यों।] (Http://mywiki.wooledge.org/ParsingLs) – XZS

2

@ piokuc के जवाब की @ gniourf_gniourf की आलोचना का जवाब करने के लिए:

part1=`dirname "$p"` 
part2=`basename "$p"` 

(मैं एक टिप्पणी में प्रतिक्रिया व्यक्त की है, लेकिन है कि वाक्य रचना असंभव है।)