# La liste des fichiers du répertoire DOCUMENTS (et de ses sous-répertoires)
# est traitée par la commande awk qui va générer un fichier contenant toutes
# commandes necessaires à la copie des fichiers.
find DOCUMENTS -type f |
awk -v dest_dir=FINAL '
# Pour chaque fichier trouvé, les informations necessaires à la copie
# sont mémorisées dans le tableau copy. Ce dernier comporte une entrée
# par fichier (index = chemenin complet actuel du fichier) dont la valeur
# est le chemin complet du fichier aprés copie.
# On constitue aussi, la liste des répertoires finaux dans le tableau
# dest_dir.
{
levels = split($0, path, /\//); # Décomposition du chemin du fichier
if (levels != 3) next; # Il doit y avoir 3 niveaux (DOCUMENTS/sous-rep/fichier)
# si ce n est pas le cas, on passe au fichier suivant.
sdir = path[2]; # Sous-répertoire du fichier
file = path[3]; # Nom du fichier
ext = file; # Extension du fichier = Nom du fichier, dans lequel on supprime
if (! sub(/^.*\./, "", ext)) next; # tout jusqu au dernier point. S il n y a pas d extension,
# on passe au fichier suivant.
ddir = dest_dir "/" toupper(ext) "/" sdir; # Répertoire final.
dest_sdir[ddir]++; # Le répertoire final est mémorisé dans le table dest_sdir
# en tant qu index du tableau.
copy[$0] = sprintf("%s/%s", ddir, file); # Le chemin complet du fichier final est mémorisé
# dans le tableau copy avec pour index le chemin du
# fichier à copier.
}
# Tous les fichier ont été mémorisées.
# Les commandes necessaires à la copie des fichier va être générée.
# On commence par générer les commandes de création des répertoires de destination.
# Les commandes de copie sont ensuite générées.
END {
print "\n# Création arborescence destination\n"
for (ddir in dest_sdir) # Pour chaque index du tableau dest_sdir (= répertoire destination)
print "mkdir -p " ddir; # Génération commande de création du répertoire.
print "\n# Copie des fichiers dans arborescence destination\n";
for (file in copy) # Pour chaque index du fichier copy (= chemin fichier à copier)
print "cp",file,copy[file]; #Génération de la commande de copie.
}
'> ./copy_files.sh # Exécution du fichier généré
. ./copy_files.sh |