J'essaie de tronquer les noms de fichiers jusqu'aux 4 derniers chiffres (exemple: 941_S_5193 pour devenir 5193). Quel serait le moyen le plus simple de boucler cette commande à appliquer à environ 600 fichiers?
Je vous remercie. -KM
La commande rename
peut le faire assez bien:
# Note, -n flag used for testing only, remove for actual renaming
$ ls
941_P_5191 941_P_5192 941_P_5193 941_P_5194
$ rename -n 's/^(.*)_([0-9]{4})$/$2/' ./*
./941_P_5191 renamed as 5191
./941_P_5192 renamed as 5192
./941_P_5193 renamed as 5193
./941_P_5194 renamed as 5194
Vous pouvez également supprimer les préfixes dans bash et mv dans la boucle for
:
$ for f in ./*; do echo mv "$f" "${f##*_}"; done
mv ./941_P_5191 5191
mv ./941_P_5192 5192
mv ./941_P_5193 5193
mv ./941_P_5194 5194
Remarque: supprimez echo
pour que le changement de nom ait effectivement lieu.
Vous avez donné 941_S_5193
comme un nom de fichier, mais quelques autres seraient utiles. J'ai évoqué cette commande find
qui l'a fait avec un exemple de fichier appelé 941_S_5193
:
find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
Exemples de noms de fichiers:
941_S_5194
923_D_5234
941_S_5193
941_S_5134
941_A_0034
941_C_9034
En utilisant cette commande:
find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
Produit ces changements de noms de fichiers:
rename(./941_S_5194, ./5194)
rename(./923_D_5234, ./5234)
rename(./941_S_5193, ./5193)
rename(./941_S_5134, ./5134)
rename(./941_A_0034, ./0034)
rename(./941_C_9034, ./9034)
Résultats:
0034
5134
5193
5194
5234
9034
Les étapes pour apprécier pleinement la commande sont les suivantes:
find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*'
pour trouver les fichiers qui seront modifiés,(1)
échouent, alors la regex
ne correspond pas aux noms de fichier, modifiez la regex et mettez à jour votre question, sinonQuand il se présente comme prévu, ajoutez la partie -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
à la commande à l'étape (1), de sorte qu'elle trouve et vous montre ce qui doit être renommé.
find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
Lorsque vous avez terminé, supprimez l’option -n
pour renommer ces fichiers. Ainsi:
find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' -exec rename -n 's/[[:digit:]]*_[[:alpha:]]_//' {} \;
J'aurais suggéré une boucle parmi les éléments du répertoire en utilisant ls | tail -c 5
pour répertorier les 4 derniers chiffres de chaque fichier.