2009-08-09 8 views
13

मेरे पास कई हज़ार ईबुक हैं जिन्हें एसएसएच के माध्यम से चलने वाले हेडलेस लिनक्स सर्वर पर व्यवस्थित करने की आवश्यकता है। सभी ईबुक का आभारपूर्वक 2 सम्मेलनों में से एक के साथ नामित किया गया है।फाइलनाम के पहले भाग के आधार पर फ़ाइलों को निर्देशिका में ले जाएं?

  • AuthorFirstName AuthorLastName - पुस्तक Title.pdf
  • AuthorFirstName AuthorLastName - पुस्तक श्रृंखला #inSeries - पुस्तक Title.pdf

मुझे क्या करना चाहते हैं एक में पुस्तकों के सभी स्थानांतरित करने के लिए है संगठित प्रणाली जैसे कि:

`DestinationDirectory/FirstLetterOfAuthorFirstName/Author Full Name/pdf's` 

उदाहरण निम्नलिखित पुस्तकों

Andrew Weiner - Changes.pdf 
Allan Cole - Timura Trilogy 01 - When the Gods Slept.pdf 

निम्न फ़ोल्डरों

/books/A/Allan Cole/Allan Cole - Timura Trilogy 01 - When the Gods Slept.pdf 
/books/A/Andrew Weiner/Andrew Weiner - Changes.pdf 

मैं कैसे सब एक bash स्क्रिप्ट है कि वर्तमान में सभी पीडीएफ फाइलों की फ़ाइल नामों को आकर्षित करेंगे में डाल करने के लिए साथ मदद की जरूरत में रखा जाना चाहिए निर्देशिका, और फिर फ़ाइलों को उचित निर्देशिका में ले जाएं, निर्देशिका बनाते हैं यदि यह पहले से मौजूद नहीं है।

उत्तर

12
for f in *.pdf; do 
    name=`echo "$f"|sed 's/ -.*//'` 
    letter=`echo "$name"|cut -c1` 
    dir="DestinationDirectory/$letter/$name" 
    mkdir -p "$dir" 
    mv "$f" "$dir" 
done 
+1

धन्यवाद! वह खूबसूरती से काम किया! sed और कट वे प्रोग्राम हैं जिन्हें मैंने पहले से काम नहीं किया है, मैं देख सकता हूं कि वे चीज़ें हैं जिन्हें मुझे सीखना चाहिए –

+1

नेस्टेड 'ls' कमांड अनावश्यक है। यह पर्याप्त से अधिक है: 'एफ में * .pdf के लिए; करो ... 'मैं सोचता रहता हूं कि लोग इस तरह से' एलएस 'का उपयोग क्यों करते हैं। – greyfade

+0

@ lreyfade कारण है कि ls क्यों है क्योंकि अन्यथा स्क्रिप्ट त्रुटि/विफल हो जाएगी यदि वर्तमान कार्य निर्देशिका में कोई पीडीएफ फाइल नहीं है –

3

असल में इसे करने का एक अलग तरीका मिला, मैंने सोचा कि मैं इसे दूसरों के लिए देखने/उपयोग करने के लिए पोस्ट कर दूंगा।

#!/bin/bash 
dir="/books" 
if [[ `ls | grep -c pdf` == 0 ]] 
then 
     echo "NO PDF FILES" 
else 
     for src in *.pdf 
     do 
       author=${src%%-*} 
       authorlength=$((${#author}-1)) 
       letter=${author:0:1} 
       author=${author:0:$authorlength} 
       mkdir -p "$dir/$letter/$author" 
       mv -u "$src" "$dir/$letter/$author" 
     done 
fi 
1
 
for i in *.pdf; do 
    dir=$(echo "$i" | \ 
    sed 's/\(.\)\([^ ]\+\) \([^ ]\+\) - \(.*\)\.pdf/\1\/\1\2 \3/') 
    dir="DestinationDirectory/$dir" 
    mkdir -p -- "$dir" && mv -uv "$i" "$dir/$i" 
done 
2

@OP तुम सिर्फ पार्टी के साथ यह कर सकते हैं

dest="/tmp" 
OFS=$IFS 
IFS="-" 
for f in *.pdf 
do 
    base=${f%.pdf} 
    letter=${base:0:1} 
    set -- $base 
    fullname=$1 
    pdfname=$2 
    directory="$dest/$letter/$fullname" 
    mkdir -p $directory 
    cp "$f" $directory 
done 
IFS=$OFS