web-dev-qa-db-fra.com

Renommer plusieurs fichiers avec des noms complexes numérotés

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?

6
Vaishali Jain

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.

10
muru

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.

6
Arronical

Vous pouvez utiliser la commande renamecomme 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.

Remarques

  • s/old/new remplace oldpar newname__
  • \. literal .
  • ... trois caractères qui pourraient être n'importe quoi
  • (some chars) save some chars à référencer plus tard avec $1
  • Nous pourrions utiliser une expression rationnelle simple pour faire correspondre la première partie du nom de fichier de la commande renamename__, 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 renamepour créer les noms que vous avez réellement demandés ... Si tel est le cas, je mettrai à jour ma réponse. réponse de mur fait ça ...).

Notez que Perl renamen’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
6
Zanna

Le code ci-dessous fera ce qui suit:

  1. boucle sur tous les fichiers qui commence par MOD et se termine par .hdf
  2. Assigne une variable qui augmentera sa valeur en 1 pour chaque fichier
  3. 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
5
Yaron