giovedì 8 maggio 2008

Organizzare i file sulla base del loro nome

Il programma che presento qui è un semplice script shell che organizza i file in cartelle a seconda del loro nome, che viene usato come chiave parlante.

Supponendo di avere una serie di file in formato PDF (e con estensione .pdf), il cui nome è composto da un prefisso identico (statistiche-), da un codice che identifica una tipologia (es. 03000123), e dalla data di generazione del file o della statistica (in formato gg_mm_yyyy_) , tutti contenuti nella medesima cartella. Questi file devono essere archiviati in una directory diversa, con nome pari all'anno presente nel file (yyyy) e al suo interno a sua volta in una cartella con nome pari al codice del file. In altre parole il file:

statistiche-03000123-19_07_2008.pdf

deve essere archiviato come segue (creando le eventuali directory che non esistono):

2008/03000123/statistiche-03000123-19_07_2008.pdf

Di seguito lo script che opera lo spostamento. Da notare l'utilizzo del comando sed(1) per la separazione della stringa nome file nelle sue componenti, come pure la creazione delle directory con flag -p.


#!/bin/bash

# directory base ove lavorare
BASE_DIR=/mnt/pdf
ANNO=`date +'%Y'`


# se l'utente specifica un argomento allora
# considero che il primo argomento sia la directory
# di lavoro
if [ $# -ge 1 ]
then
BASE_DIR=$1
fi


# controllo che la directory di lavoro esista
if [ ! -d "$BASE_DIR" ]
then
echo "La directory di lavoro $BASE_DIR non esiste"
exit 1
fi


# entro nella directory di lavoro
cd "$BASE_DIR"

for f in *.pdf
do
# nome di base del file, dal quale ricavare le informazioni
FILE=`basename "$f" ".pdf"`

# etsraggo il codice dal nome del file
CODICE=`echo $FILE | sed 's/statistiche-\(.*\)-\(.*\)/\1/'`

# estraggo l'anno di pertinenza dalla data di stampa contenuta
# nel nome del file
ANNO=`echo $FILE | sed 's/statistiche-\(.*\)-[0-9][0-9]_[0-9][0-9]_\([0-9][0-9][0-9][0-9]\)/\2/'`

# la directory di destinazione di questo file
# e' data dall'anno e dal codice
DIR=$ANNO/$CODICE

if [ ! -d "$DIR" ]
then
mkdir -p $DIR >/dev/null 2>&1
fi

# sposto il file
mv $f $DIR -v
done


Nessun commento: