Bash: passer une liste à un script

Dans l’hypothèse où le travail de recherche de « méta-données » est déjà disponible en amont dans un fichier index.csv, une seule commande suffira pour renommer les fichiers:

Démonstration/préparation test:

$ mkdir /tmp/test ;cd /tmp/test ;touch {a,b,c}1.jpg
$ cat << EOF > index.csv
a1.jpg,a2.jpg
b1.jpg,b2.jpg
c1.jpg,c2.jpg
EOF
$ ls
a1.jpg b1.jpg c1.jpg
$ awk -F, '{system("mv "$1" "$2)}' index.csv
$ ls *.jpg
a2.jpg b2.jpg c2.jpg

La conclusion claire et sans appel est bien que la difficulté n’est pas dans le « comment » faire, mais dans le « quoi », la définition de ce qu’il faut faire, en fournissant un kit de test.

Toutes ces solutions sont intéressantes, et je vous en remercie.
Mais elles me disent comment faire autre-chose ce que je cherche.
Ma recherche est plus générale que le simple exemple de renommer en fonction de ses métadonnées (ça pourrait aussi bien être des extraits de texte ou d’autres informations… toutes choses que je sais ou pourrais faire en ligne de commande sur une liste).

La question initiale aurait due être, (indépendamment de l’exemple de renommage): est-il possible passer simplement à un script bash une liste de noms de fichiers donnée par des jockers bash, comme on peut le faire avec Perl5 et sa fonction glob (si je me souviens bien de mes très vieux souvenirs de débutant autodidacte).

Je viens de trouver, un vieux script oublié depuis longtemps, à peine modifié (boucle while pour utiliser facilement le nombre d’arguments).
La syntaxe ${!variable} de bash – que j’avais oubliée depuis longtemps – est une fonction «eval» sur la variable.

Le script suivant marche très simplement, à ma grande surprise (et peut-être à la votre?)

#!/bin/bash --
NBARG=$#
echo " $NBARG arguments reçus par le script"
i=0
while [[ "$i" -lt "$NBARG" ]] 
do
        ((i++))
        echo "Rang: $i → fichier: ${!i}"
done

#La syntaxe ${!variable} est une fonction «eval» sur $variable

Ce qui donne par exemple:
$TableauDArguments.sh *bkp r*txt

 13 arguments reçus par le script
Rang: 1 → fichier: BKP_incrementale.bkp
Rang: 2 → fichier: IdentifierUSBrsync.sh.bkp
Rang: 3 → fichier: lscl.bkp
Rang: 4 → fichier: parallel.bkp
Rang: 5 → fichier: projet_latex.bkp
Rang: 6 → fichier: rsyncClevoSamsung2T.sh.bkp
Rang: 7 → fichier: rsyncClevoToshiba.sh.bkp
Rang: 8 → fichier: rsync_Elements.sh.INIbkp
Rang: 9 → fichier: svmi.bkp
Rang: 10 → fichier: rsyncECMbash.txt
Rang: 11 → fichier: rsyncSeagate4Tsimplifie.txt
Rang: 12 → fichier: rsyncStructureBug.txt
Rang: 13 → fichier: rsyncStructure.txt

Évidemment dans la boucle while, je peux enfin faire ce que je veux, comme:

Extraire un champs dans les metadonnées (par exemple champs date de la photo, à défaut champs de dernière modification, à défaut date du fichier) et l’utiliser pour renommer le fichier d’un nom plus humain!.

Je suis désolé ne n’avoir pas su m’expliquer plus clairement, mais surpris que ce script si simple fonctionne !

Bonjour

En utilisant la commande shift :

#!/bin/bash

while test ! -z "$1"; do
    ((i++))
    echo "$i -> '$1'"
    shift
done

Pour aller directement à la page du manuel de bash concernée par la commande shift
lancez la ligne de commande suivante :

man --pager='less -p "shift \["' bash

shift est effectivement plus simple et efficace.

J’ai préféré utiliser ici la variable « $# », parce qu’elle montre simplement qu’on peut passer à un script une liste de fichiers avec les jockers de bash.


[Hors sujet]

Et on pourrait même utiliser $#
pour inverser l’ordre de la numérotation :

#!/bin/bash

while test ! -z "$1"; do
    echo "$# -> '$1'"
    shift
done

[/Hors sujet]

Bonjour Désole du détarage mais
jhead -n%Y-%m-%d-%H-%M-%S *
renome tous les jpg avec l’heure de création par exemple.
-nunmom pour indiquer un nom en plus de la date

1 J'aime

Bonjour,

Je me disais tout bas que la bonne méthode était peut - être de regarder $# pour parcourir $1 à $$#.