Question

J'ai beaucoup de fichiers que je suis en train de renommer, j'ai essayé de faire une expression régulière pour les faire correspondre, mais même que je suis resté bloqué sur les fichiers sont nommés comme:

  

Nom du fichier 01

     

Nom du fichier 100

     

Nom du fichier 02

     

Nom du fichier 03

etc, je voudrais ajouter un « 0 » (zéro), derrière l'un des fichiers qui sont à moins de 100, comme ceci:

  

Nom du fichier 001

     

Nom du fichier 100

     

Nom du fichier 002

     

Nom du fichier 003

Le plus proche je suis arrivé à tant que les jumelant utilisait cette trouvaille -type d | sort -r | grep « [1-9] [0-9] $ » mais je ne pouvais pas comprendre comment les remplacer. Merci d'avance pour toute aide que vous pouvez me proposer. Im sur CentOS si cela est de toute aide, tout cela se fait via SSH.

Était-ce utile?

La solution

perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'

Un peu exagéré peut-être, mais il fait ce qu'on lui demande.

Autres conseils

find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e' 

ou quelque chose comme ça, à condition

  1. Vous avez GNU trouver et xargs GNU (pour -print0 et -0)
  2. Vous avez l'utilitaire 'Rename' qui vient avec perl
  3. Il n'y a qu'un seul groupe de chiffres dans le nom du fichier. S'il y a plus d'un, alors vous devez faire quelque chose avec le regex pour le faire correspondre uniquement le numéro que vous voulez reformater.

Est-ce une chose une seule fois? Si oui, je vais suggérer quelque chose qui peut sembler être un flic par de nombreux programmeurs ici:

redirigez la sortie de votre commande (find -type d | sort -r | grep ' [1-9][0-9]$') dans un fichier et utiliser un éditeur avec une recherche globale / remplacer la magie pour créer un script qui fait le renomme.

Ensuite jeter loin le script.

Il y a peu de bruit et peu de chances que vous finirez par vous tirer une balle dans le pied en ayant une tentative intelligente (mais insuffisamment débogué) en une ligne se déclenche dans les mauvaises herbes sur vos fichiers.

Exécuter deux commandes, dans cet ordre:

$ rename 's/File Name (\d)$/File Name 0$1/' *
$ rename 's/File Name (\d\d)$/File Name 0$1/' *

D'abord un renomme tout à moins de 10 et prepends un zéro. Le second renomme tout à moins de 100 et prepends un zéro. Le résultat devrait être trois chiffres pour tous les noms de fichiers.

Dans mon debian il fonctionne bien avec changement de nom, testé avec 300 fichiers.

 perl -e 'map `touch door$_.txt`, 1..300;'
 rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt

Je pense que MMV est votre ami ici.

vous pouvez faire quelque chose en utilisant Perl ou Ruby.

mettre tous ces fichiers dans le même répertoire

dirlisting = DIR.entries('.')

dirListing.each do |file| 
 num = file.match(/\d+$/).to_i
 if num < 100
   find the position where start the number, with index and inject the 0 there.
 end
end
use strict;
use File::Copy;

my @files = glob 'File*Name*';

foreach my $filename (@files) {
    if ($filename =~ m`^.*File.*Name.*?(\d+)`) {
        my $number = $1;
        next if ($number > 99);
        rename $filename, sprintf("FileName%03d",$number);
    }
}

si votre télécommande a shell bash

for i in File*; 
do 
    case "${i##* }" in  [0-9][0-9] ) 
      echo  mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;; 
    esac; 
done

remove "echo" pour faire renommer réelle

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top