web-dev-qa-db-fra.com

Renommer des fichiers dans des sous-dossiers avec des noms de dossiers parents

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.

1
Tak

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)))
2
Lety

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)

5
steeldriver