Come posso facilmente Bulk Rename file con il Perl?
Domanda
Ho un sacco di file che sto cercando di cambiare titolo, ho cercato di fare un'espressione regolare per corrispondere loro, ma anche questo mi sono bloccato sui file sono denominati come:
Nome file 01
Nome file 100
Nome file 02
Nome file 03
ecc, vorrei aggiungere uno "0" (zero), dietro a uno qualsiasi dei file sono meno di 100, in questo modo:
Nome file 001
Nome file 100
Nome file 002
Nome file 003
Il più vicino ho avuto modo di così tanto come corrispondenza li stava usando questa scoperta tipo d | sorta -r | grep '[1-9] [0-9] $', tuttavia, non riuscivo a capire come sostituire loro. Grazie in anticipo per tutto l'aiuto che mi può offrire. Im su CentOS se questo è di alcun aiuto, tutto questo è stato fatto tramite SSH.
Soluzione
perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'
Un po 'eccessivo forse, ma fa quello che viene chiesto.
Altri suggerimenti
find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e'
o qualcosa di simile, a condizione
- Devi trovare GNU e xargs GNU (per
-print0
e-0
) - Hai l'utilità 'rinomina' che viene fornito con perl
- C'è un solo gruppo di cifre nel nome del file. Se c'è più di uno, allora avete bisogno di fare qualcosa con la regex per farlo corrispondere solo il numero che si desidera riformattare.
Si tratta di una cosa di una volta? Se è così, ho intenzione di suggerire qualcosa che potrebbe sembrare di essere un poliziotto fuori da molti programmatori qui:
Tubazioni l'output del comando (find -type d | sort -r | grep ' [1-9][0-9]$'
) in un file e utilizzare un editor insieme a qualche ricerca globale / sostituire la magia per creare uno script che fa del cambiamento di nome.
Poi buttare via il copione.
C'è poca confusione e poche possibilità che si finirà per le riprese in un piede da avere qualche tentativo di un intelligente (ma non adeguatamente debug) one-liner andare fuori nelle erbacce sui vostri file.
Esegui due comandi, in questo ordine:
$ rename 's/File Name (\d)$/File Name 0$1/' *
$ rename 's/File Name (\d\d)$/File Name 0$1/' *
In primo luogo si rinomina tutto inferiore a 10 e antepone uno zero. Il secondo rinomina tutto meno di 100 e anteporre uno zero. Il risultato dovrebbe essere di tre cifre per tutti i nomi di file.
Nella mia debian funziona bene con rename, testato con 300 file.
perl -e 'map `touch door$_.txt`, 1..300;'
rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt
mmv è tuo amico qui.
si potrebbe fare qualcosa utilizzando Perl o Ruby.
mettere tutto questo file nella stessa cartella
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);
}
}
Se il telecomando dispone shell bash
for i in File*;
do
case "${i##* }" in [0-9][0-9] )
echo mv "$i" "${i% *} $(printf "%03d" ${i##* })" ;;
esac;
done
rimuovere "echo" fare reale rinominare