web-dev-qa-db-fra.com

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

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 ligne typique ressemble à ceci:

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

    Je peux enlever les guillemets, ce n'est pas un problème.

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

Il y a des réponses autour, e. g.:

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 du disque qui remplissent certaines conditions. Bien sûr, ce dernier doit être évité.

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

Merci d'avance.

10
take2

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=,: fractionner l'entrée sur ,
  • while read orig new; do ... done: Ceci lira chaque ligne d’entrée, la divisera sur la valeur de $IFS (ici une virgule) et enregistrera le premier champ sous le nom $orig et le reste sous le nom $new.
  • mv "$orig" "$new": ceci renommera les fichiers comme demandé.

Si votre fichier ne contient que des noms de fichier (tels que orig.jpg) et aucun chemin (pas /home/take2/orig.jpg ou similaire), la commande ci-dessus n'affectera que les fichiers de votre répertoire actuel. Vous devez donc ouvrir un terminal, cd, dans le répertoire cible et l'exécuter à cet emplacement.

Test d'abord:

Pour tester cela, vous pouvez 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 
11
terdon