2009-08-09 10 views
13

Ho diverse migliaia di ebook che devono essere organizzati su un server Linux senza testa che esegue bash tramite SSH. Tutti gli ebook sono per fortuna nominati con una delle 2 convenzioni.Spostare i file nelle directory in base alla prima parte del nome file?

  • AuthorFirstName AuthorLastName - Prenota Title.pdf
  • AuthorFirstName AuthorLastName - Book #inSeries Serie - Prenota Title.pdf

Quello che vorrei fare è quello di spostare tutti i libri in un sistema organizzato come:

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

es. i seguenti libri

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

devono essere collocati nelle seguenti cartelle

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

ho bisogno di aiuto con il modo di mettere tutto questo in uno script bash che catturerà i nomi di tutti i file PDF nella corrente directory, quindi spostare i file nella directory corretta, creando la directory se non esiste già.

risposta

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

Grazie! Ha funzionato magnificamente! sed e cut sono programmi con cui non ho mai lavorato in precedenza, vedo che sono cose che dovrei imparare –

+1

Il comando nidificato 'ls' non è necessario. Questo è più che adeguato: 'for f in * .pdf; fai ... 'Continuo a chiedermi perché la gente usa' ls' in questo modo. – greyfade

+0

@greyfade il motivo per cui ls è presente perché altrimenti lo script si guasterà/non riuscirà se non ci sono file PDF nella directory di lavoro corrente quando viene eseguito –

3

In realtà ho trovato un modo diverso di farlo, ho pensato di postare questo per gli altri per vedere/utilizzare se lo vorrebbero.

#!/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 si può fare con un semplice 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 
Problemi correlati