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.

È stato utile?

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

  1. Devi trovare GNU e xargs GNU (per -print0 e -0)
  2. Hai l'utilità 'rinomina' che viene fornito con perl
  3. 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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top