J'ai 365 fichiers nommés
MOD11A1.A2010001.h24v06.006.2016025150444.hdf
MOD11A1.A2010002.h24v06.006.2016025151748.hdf
MOD11A1.A2010003.h24v06.006.2016025163706.hdf
et je veux renommer ces fichiers en:
modis1.hdf
modis2.hdf
modis3.hdf
J'utilise la commande mv
séparément pour chaque fichier afin de les renommer.
Comment y parvenir en une fois?
Puisque vous ne vous souciez que du bit A2010...
, utilisez rename
dans le répertoire contenant les fichiers:
rename -n 's/.*A2010*(\d+).*/modis$1.hdf/' *
Exemple:
$ rename -n 's/.*A2010*(\d+).*/modis$1.hdf/' *
rename(> MOD11A1.A2010001.h24v06.006.2016025150444.hdf, modis1.hdf)
rename(> MOD11A1.A2010002.h24v06.006.2016025151748.hdf, modis2.hdf)
rename(> MOD11A1.A2010003.h24v06.006.2016025163706.hdf, modis3.hdf)
rename(> MOD11A1.A2010365.h24v06.006.2016025150444.hdf, modis365.hdf)
Exécuter sans -n
pour renommer les fichiers.
La méthode suivante utilise le développement des paramètres bash, mais elle repose sur le fait que vos noms de fichiers sont exactement dans le format que vous avez indiqué, car ils reposent sur le placement de la chaîne numérique à utiliser. Ce n'est pas nécessairement la méthode la plus robuste. Vous devez également être dans le répertoire contenant les fichiers.
for f in MOD*.hdf; do
num="${f:13:3}"
mv "$f" modis"$((10#$num))".hdf
done
Ou comme une ligne:
for f in MOD*.hdf; do num="${f:13:3}"; mv "$f" modis"$((10#$num))".hdf ; done
Cela déplacera les fichiers de la manière que vous avez demandée, ce qui signifie que MOD11A1.A2010001.h24v06.006.2016025150444.hdf
deviendra modis1.hdf
, MOD11A1.A2010002.h24v06.006.2016025151748.hdf
deviendra modis2.hdf
etc.
Vous pouvez utiliser la commande rename
comme ceci:
$ rename -n 's/MOD11A1\.A2010(...)\..*/modis$1.hdf/' MOD*.hdf
rename(MOD11A1.A2010001.h24v06.006.2016025150444.hdf, modis001.hdf)
rename(MOD11A1.A2010002.h24v06.006.2016025151748.hdf, modis002.hdf)
rename(MOD11A1.A2010003.h24v06.006.2016025163706.hdf, modis003.hdf)
Après le test, supprimez -n
pour renommer les fichiers.
s/old/new
remplace old
par new
name__\.
literal .
...
trois caractères qui pourraient être n'importe quoi(some chars)
save some chars
à référencer plus tard avec $1
rename
name__, comme le fait la réponse de muru. Parfois, vous souhaitez utiliser une expression plus explicite pour faire la distinction entre les fichiers sur lesquels vous voulez ou non agir, ou pour vous assurer que votre expression régulière n'aspire pas trop de caractères. Il y a généralement beaucoup de souplesse dans la résolution de ce type de problème.Notez que cela ne vous donne pas exactement ce que vous avez demandé ; il maintient la largeur fixe des nombres. Je l’ai fait parce que c’est une bonne idée d’utiliser des nombres à largeur fixe dans les noms de fichiers (sinon, ils seront triés de manière confuse, avec 10 avant 2, par exemple) (et parce que je n'ai pas compris comment utiliser réponse de mur fait ça ...).rename
pour créer les noms que vous avez réellement demandés ... Si tel est le cas, je mettrai à jour ma réponse.
Notez que Perl rename
n’est pas inclus dans l’installation par défaut de 17.1 , donc si vous exécutez 17.10 (ou pour les futurs lecteurs, peut-être une version ultérieure), commencez par exécuter
Sudo apt install rename
Le code ci-dessous fera ce qui suit:
MOD
et se termine par .hdf
exécutez la commande mv
sur le fichier actuel de la liste et remplacez son nom par modis
suivi du numéro de la variable, après le .hdf
#!/bin/bash
idx=1
for file in MOD*.hdf
do
echo mv "$file" "modis$((idx++)).hdf"
done
Remarque: le script ci-dessus ne modifiera que echo
la commande qu'il a l'intention d'exécuter. Vous devez supprimer le echo
de la ligne echo mv
pour pouvoir exécuter l'action.
Exemple de sortie:
mv MOD11A1.A2010001.h24v06.006.2016025150444.hdf modis1.hdf
mv MOD11A1.A2010002.h24v06.006.2016025151748.hdf modis2.hdf
mv MOD11A1.A2010003.h24v06.006.2016025163706.hdf modis3.hdf