2009-08-09 15 views
13

Mam kilka tysięcy e-booków, które muszą być zorganizowane na bezobsługowym serwerze linuxowym działającym przez bash przez SSH. Wszystkie e-książki są nazywane wdzięcznie jedną z 2 konwencji.Przenieść pliki do katalogów na podstawie pierwszej części nazwy pliku?

  • AuthorFirstName AuthorLastName - Book Title.pdf
  • AuthorFirstName AuthorLastName - Seria wydawnicza #inSeries - Book Title.pdf

Co chciałbym zrobić, to przenieść wszystkie książki w produkt zorganizowany system taki jak:

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

np. następujące książki

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

powinien być umieszczony w następujących folderach

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

Potrzebuję pomocy, jak umieścić to wszystko w skrypcie bash, który będzie chwycić nazw wszystkich plików PDF w prądzie katalogu, a następnie przenieś pliki do właściwego katalogu, tworząc katalog, jeśli jeszcze nie istnieje.

Odpowiedz

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

Dziękujemy! To się udało pięknie! sed i cut to programy, z którymi wcześniej nie pracowałem, widzę, że są to rzeczy, których powinienem się nauczyć –

+1

Zagnieżdżone polecenie 'ls' jest niepotrzebne. Jest to więcej niż wystarczające: 'for f in * .pdf; do ... 'Zastanawiam się, dlaczego ludzie używają' ls' w ten sposób. – greyfade

+0

@greyfade powód, dla którego istnieje ls, ponieważ w przeciwnym razie skrypt będzie generował błąd/zawiedzie, jeśli w bieżącym katalogu roboczym nie ma plików PDF, gdy jest uruchamiany –

3

Właściwie znalazłem inny sposób robienia tego, po prostu pomyślałem, że opublikuję to, aby inni mogli je zobaczyć/użyć, jeśli zechcą.

#!/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 można to zrobić tylko z bash

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 
Powiązane problemy