web-dev-qa-db-fra.com

Tronquer les noms de fichiers

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

1
klmpc

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.

2

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

Remarque: l'utilisation de l'option '-n' dans la commande renommer vous permet de voir ce qui doit être renommé avant de procéder au changement de nom actuel. Supprimez cette option lorsque vous êtes prêt à renommer ces fichiers.

Les étapes pour apprécier pleinement la commande sont les suivantes:

  1. Commencez par utiliser ce find /users/desktop/km/neuroimage/struct/ -type f -iname '[[:digit:]]*_[[:alpha:]]_*' pour trouver les fichiers qui seront modifiés,
  2. Si les étapes (1) échouent, alors la regex ne correspond pas aux noms de fichier, modifiez la regex et mettez à jour votre question, sinon
  3. Quand 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:]]_//' {} \;

  4. 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:]]_//' {} \;
0
George Udosen

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.

0
Ross