Un script CLI Unix pour renommer les dossiers en utilisant leurs noms préexistants

J’ai un répertoire avec structure de dossiers comme suit:

-- DATA -- ABD 1231345 -- 01-08-12 // date in mm-dd-yy format -- 03-09-12 -- 06-11-12 -- DEF 4859480 -- 02-10-12 -- 05-10-12 -- 07-10-12 

Je voudrais renommer par lots ce dossier DATA comme suit

 -- DATA -- ABD 1231345 -- 2012_01_08 // date in yyyy_mm_dd format with underscore -- 2012_03_09 -- 2012_06_11 -- DEF 4859480 -- 2012_02_10 -- 2012_05_10 -- 2012_07_10 

Avez-vous une suggestion sur comment accomplir en utilisant la ligne de commande sur Mac OSX / unix?

Vous pouvez utiliser une boucle for et awk , en analysant chaque nom de fichier dans le format que vous avez spécifié, puis mv pour renommer l’original au nouveau nom:

 for dir in DATA/*; do \ pushd "$dir"; # change directory \ for file in *; do \ path=`echo $file | awk -F- '{print "20"$3"_"$1"_"$2}'`; \ mv $file $path; # "rename" the file \ done; \ popd; # restore original directory \ done; 

Cela peut être exécuté dans le dossier ci-dessus DATA . Si vous voulez l’exécuter directement dans DATA , mettez à jour la première boucle à lire for dir in *; do for dir in *; do au lieu de DATA/* . Il indique à awk d’utiliser le - comme délimiteur (au lieu des espaces), puis reconstruit une chaîne de “mm-jj-aa” à “20yy_mm_dd”.

Utiliser pushd et popd permettra au script de changer le répertoire actuel en chaque sous-répertoire de DATA ( pushd ), puis, après avoir déplacé tous les fichiers nécessaires, reviendra à l’original ( popd ). Cela vous permettra d’économiser beaucoup d’efforts d’parsing en essayant de sauvegarder les chemins de répertoire / etc.

Vous pouvez utiliser des manipulations de chaînes et des tableaux pour le faire uniquement avec bash.

Quelque chose comme:

 for f in * ; do parts=(${f//-/ }) mv "$f" "20${parts[2]}_${parts[1]}_${parts[0]}" done 

Recherchez dans ce site diverses options permettant de générer des répertoires, par exemple: Script shell pour parcourir les répertoires

Utilisez la commande date pour convertir le nom de fichier:

 $ date -j -f %m-%d-%y 01-08-12 +%Y_%m_%d 2012_01_08 

Accéder aux fichiers est un peu difficile. Nous allons simplement changer de répertoire pour éviter les longs chemins de fichier.

 for d in DATA; do pushd "$d" for f in *; do new_f=$(date -j -f %m-%d-%y $f +%Y_%m_%d) mv "$f" "$new_f" done popd done 

Ce site donne un bon extrait

 for i in *.avi; do j=`echo $i | sed 's/(\d{2})-(\d{2})-(\d{2})/20\3_\1_\2/g'`; mv "$i" "$j"; done