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