2009-08-09 12 views
13

SSH aracılığıyla bash çalıştıran başsız bir linux sunucusunda organize edilmesi gereken birkaç bin e-kitap var. Tüm e-kitaplar, 2 sözleşmeden biri ile nezaketle adlandırılmıştır.Dosyaları, dosya adının ilk bölümüne göre dizinlere taşıyın?

  • AuthorFirstName AuthorLastName - Kitap Title.pdf
  • AuthorFirstName AuthorLastName - Kitap Serisi #inSeries - Kitap Title.pdf

Ne yapmak istiyorum bir içine kitapların hepsi taşımaktır düzenlenmiş sistem, örneğin:

Aşağıdaki kitaplar

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 

tüm akım tüm PDF dosyalarının dosya adlarını çekecek bir bash komut dosyasına koymak nasıl yardıma ihtiyacım aşağıdaki klasörlerden yerleştirilmelidir dizini ve ardından dosyaları uygun dizine taşıyın, eğer varsa, dizini yaratın.

cevap

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

teşekkür ederiz! Bu güzelce çalıştı! sed ve cut, daha önce hiç çalışmamış olduğum programlardır, öğrenmem gereken şeyler olduğunu görebiliyorum –

+1

Yuvalanmış 'ls' komutu gereksizdir. Bu yeterli olmaktan daha fazlası: 'f için * .pdf; Yapma… ”İnsanların neden bu şekilde kullandığını merak ediyorum. – greyfade

+0

@greyfade, ls'nin neden var olmasının nedeni, aksi halde komut dosyası, çalıştırıldığında geçerli çalışma dizininde PDF dosyası yoksa hata/başarısız olur –

3

Aslında bunu yapmanın farklı bir yolunu buldum, sadece bunu başkalarının görmesi/kullanması için kullanması için göndereyim diye düşündüm.

#!/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

sadece bash ile bunu yapabilirsiniz @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 
İlgili konular