Comment puis-je en vrac facilement renommer des fichiers avec Perl?
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.
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
- Vous avez GNU trouver et xargs GNU (pour
-print0
et-0
) - Vous avez l'utilitaire 'Rename' qui vient avec perl
- 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