2009-08-09 10 views
13

Tengo varios miles de libros electrónicos que deben organizarse en un servidor linux sin cabeza ejecutando bash a través de SSH. Todos los libros electrónicos son afortunadamente nombrados con una de las 2 convenciones.¿Mover archivos a directorios basados ​​en la primera parte del nombre de archivo?

  • AuthorFirstName AuthorLastName - libro Title.pdf
  • AuthorFirstName AuthorLastName - Libro #inSeries Series - libro Title.pdf

Lo que me gustaría hacer es mover todos los libros en una sistema organizado como:

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

por ejemplo los siguientes libros

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

deben ser colocados en las siguientes carpetas

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

Necesito ayuda con la forma de poner todo esto en un script bash que se agarra los nombres de archivo de todos los archivos PDF en el actual directorio, y luego mueva los archivos al directorio apropiado, creando el directorio si aún no existe.

Respuesta

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

Gracias! Eso funcionó maravillosamente! sed y cut son programas con los que no he trabajado anteriormente, puedo ver que son cosas que debo aprender –

+1

El comando anidado 'ls' no es necesario. Esto es más que adecuado: 'for f in * .pdf; do ... 'Me sigo preguntando por qué la gente usa' ls' de esta manera. – greyfade

+0

@greyfade la razón por la que el ls está allí es porque de lo contrario el script fallará o fallará si no hay archivos PDF en el directorio de trabajo actual cuando se ejecuta –

3

De hecho, encontré una forma diferente de hacerlo, solo pensé en publicarlo para que otros lo vean/usen si lo desean.

#!/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 puede hacerlo con sólo golpe

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 
Cuestiones relacionadas