J'ai un répertoire principal qui a quatre dossiers f1, f2, f3 and f4
chacun de ces dossiers a 10 dossiers, et chacun de ces 10 dossiers ff1...ff10
a quelques .jpeg
images avec quelques noms, disons image1
.... etc. Ce que je veux savoir, c'est comment renommer ces images .jpeg dans chacun de ces dossiers des 10 dossiers de chacun de f1, f2, f3 and f4
, afin de concaténer les dossiers parent au début de son nom, par exemple de image1.jpeg
se trouve dans f3/ff1
, puis s'appelle f3_ff1_image1.jpeg
, comme toutes les autres images des 10 autres dossiers de chacun des quatre dossiers principaux. Si quelqu'un peut nous dire comment cela peut être fait dans un fichier .sh
.
Créez un simple fichier changeName.sh
comme suit:
#!/bin/bash
fileName=$(basename $1)
filepath=$(dirname $1)
secondDir=$(basename $filepath)
firstDir=$(basename $(dirname $filepath))
parentDir=$(basename $(dirname $(dirname $filepath)))
mv $1 $filepath/${parentDir}_${firstDir}_${secondDir}_$fileName
sauvegardez-le, par exemple dans /home/yourUser/bin
.
Changer l'autorisation en changeName.sh
:
chmod +x /home/yourUser/bin/changeName.sh
Ouvrez votre fichier /home/yourUser/.bashrc
et ajoutez à la fin cette ligne:
PATH=$PATH:/home/yourUser/bin
sauvegardez-le et rechargez-le:
source .bashrc
Vous avez maintenant un nouvel utilitaire qui peut changer de nom en fichier en utilisant dossier dans nom.
Essaye ça:
find mainDirectory -name "*.jpeg" -exec changeName.sh {} \;
mainDirectory
peut être absolu ou relatif.
Testé sur lubuntu 12.04
( dirname retire le dernier composant du nom du fichier tandis que nom_base répertoire de bandes et suffixe des noms de fichiers.
Donc, pour obtenir le troisième niveau de répertoire:
parentDir=$(basename $(dirname $(dirname $filepath)))
Avec une boucle et quelques manipulations de chaîne bash
while read -rd $'\0' f; do
d="${f%/*}"; p="${d/\//_}";
echo mv -- "$f" "${d}/${p}_${f##*/}"
done < <(find -type f -name '*.jpeg' -printf '%P\0')
(supprimez la echo
une fois que vous avez confirmé qu'elle correspond bien aux fichiers)
Avec la commande rename
basée sur Perl et bash globstar
shopt -s globstar
rename -nv -- 's|(f\d+)/(ff\d+)/(image\d+)|$1/$2/$1_$2_$3|' **/*.jpeg
(supprimez le -nv
une fois que vous avez vérifié qu'il correspond bien aux fichiers)