Comment renommer par lots des fichiers (images) basés sur un fichier CSV

11

Ce que j'ai et que je veux réaliser:

  1. Il y a des milliers d'images dans un dossier.

  2. J'ai un fichier CSV avec les colonnes suivantes:

    A: nom d'origine B: nom renommé

    Une rangée typique ressemble à ceci:

    "original-1.jpg","renamed-1.jpg"  
    "original-2.jpg","renamed-2.jpg"

    Je peux supprimer les citations, ce n'est pas un problème.

  3. Maintenant, je veux utiliser une application ou exécuter un script qui recherchera toutes les images de la colonne A et les renommera en noms dans la colonne B (par exemple, original-1.jpg -> renamed-1.jpg).

Il y a quelques réponses autour, par exemple:

http://ubuntuforums.org/showthread.php?t=1069652

http://systembash.com/content/one-line-batch-rename-files-using-csv-input-file-and-awk/

Cependant, certains scripts sont impliqués et je ne sais pas si tous ces scripts affectent uniquement le dossier dans lequel vous stockez le script ou s'ils peuvent renommer tous les fichiers sur le disque qui remplissent certaines conditions. Bien sûr, ce dernier doit être évité.

Ce que je recherche est un guide simple sur la façon de renommer des fichiers et de choisir un dossier avec des fichiers.

Merci d'avance.

prendre 2
la source

Réponses:

13

Cela devrait fonctionner pour vous:

sed 's/"//g' files.csv | while IFS=, read orig new; do mv "$orig" "$new"; done 

Explication:

  • sed 's/"//g' files.csv : supprimer les guillemets
  • IFS=, : diviser l'entrée sur ,
  • while read orig new; do ... done: Cela lira chaque ligne d'entrée, la divisera sur la valeur de $IFS(ici une virgule) et enregistrera le 1er champ sous $origet le reste sous $new.
  • mv "$orig" "$new" : cela renommera les fichiers comme demandé.

Si votre fichier ne contient que des noms de fichiers (comme orig.jpg) et aucun chemin (pas /home/take2/orig.jpgou similaire), la commande ci-dessus n'affectera que les fichiers de votre répertoire actuel. Donc, vous devez ouvrir un terminal cddans le répertoire cible et l'exécuter là-bas.

Testez d'abord:

Pour tester cela, vous pouvez d'abord faire un essai à sec en imprimant les commandes qui seront exécutées sans les exécuter réellement:

sed 's/"//g' files.csv | while IFS=, read orig new; do echo mv "$orig" "$new"; done 
terdon
la source
Génial, cela s'explique mieux. :) Juste pour vérifier avant de l'exécuter - je dois cd dans le répertoire cible et exécuter cette ligne ou je dois enregistrer cette ligne en tant qu'exemple.sh puis exécuter "example.sh" à partir du terminal?
take2
@ take2, vous pouvez simplement exécuter la ligne directement. J'ai mis à jour la réponse avec un moyen de voir ce qui sera exécuté sans vraiment changer vos fichiers, je vous recommande de le faire d'abord.
terdon
Magnifique, ça marche! Encore une chose - est-ce que les étiquettes des colonnes sont importantes (elles sont "orig" et "new" pour le moment) ou renomme-t-elle simplement les noms de la colonne A en noms de la colonne B?
take2
@ take2 quelles étiquettes? Non, il prend simplement le premier champ séparé par des virgules et le renomme en second. Notez que s'il y a plus de deux champs, il le renommera au reste de la ligne. Tant que votre fichier d'entrée ressemble à ce que vous avez publié, il fonctionnera comme prévu.
terdon
Btw. Le terminal affiche également "mv: ne peut pas stat 'orig': aucun fichier ou répertoire", bien qu'il ait renommé le fichier.
take2