Как я могу легко переименовать файлы с помощью Perl? - PullRequest
5 голосов
/ 03 декабря 2009

У меня много файлов, которые я пытаюсь переименовать, я пытался создать регулярное выражение, чтобы соответствовать им, но даже то, что я застрял в файлах, называется как:

Имя файла 01

Имя файла 100

Имя файла 02

Имя файла 03

и т. Д., Я хотел бы добавить «0» (ноль) после любого файла, который меньше 100, например:

Имя файла 001

Имя файла 100

Имя файла 002

Имя файла 003

Самое близкое, что я нашел, - это найти: -type d | сортировать -r | grep '[1-9] [0-9] $' однако я не мог понять, как их заменить. Заранее спасибо за любую помощь, которую вы можете предложить мне. Я нахожусь на CentOS, если это поможет, все это делается через SSH.

Ответы [ 9 ]

12 голосов
/ 03 декабря 2009
perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'

Может быть, немного излишним, но он делает то, что просят.

9 голосов
/ 03 декабря 2009
find . -type d -print0 | xargs -0 rename 's/(\d+)/sprintf "%03d", $1/e' 

или что-то в этом роде, при условии

  1. У вас есть GNU find и GNU xargs (для -print0 и -0)
  2. У вас есть утилита переименования, которая поставляется с perl
  3. В имени файла есть только одна группа цифр. Если их несколько, вам нужно что-то сделать с регулярным выражением, чтобы оно совпадало только с числом, которое вы хотите переформатировать.
4 голосов
/ 03 декабря 2009

Это разовая вещь? Если так, то я собираюсь предложить кое-что, что могло бы показаться копом многим программистам здесь:

Передайте вывод вашей команды (find -type d | sort -r | grep ' [1-9][0-9]$') в файл и используйте редактор вместе с глобальной магией поиска / замены, чтобы создать скрипт, который будет переименовывать.

Тогда выбросьте скрипт.

Существует небольшая суета и мало шансов, что вы в конечном итоге выстрелите себе в ногу, если попытаетесь сделать несколько хитроумных (но недостаточно отлаженных) однострочек в своих файлах.

2 голосов
/ 03 декабря 2009

Запустите две команды в следующем порядке:

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

Первый переименовывает все, что меньше 10 и добавляет ноль. Второй переименовывает все меньше 100 и добавляет ноль. Результат должен быть трехзначным для всех имен файлов.

1 голос
/ 03 декабря 2009

В моем Debian он хорошо работает с переименованием, протестировано с 300 файлами.

 perl -e 'map `touch door$_.txt`, 1..300;'
 rename 's/(\d+)\.txt/sprintf("%03d.txt", $1)/e' *.txt
0 голосов
/ 03 декабря 2009

если у вашего пульта есть оболочка bash

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

удалить "echo", чтобы сделать реальное переименование

0 голосов
/ 03 декабря 2009
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);
    }
}
0 голосов
/ 03 декабря 2009

вы можете сделать что-нибудь, используя perl или ruby.

поместите все эти файлы в один каталог

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
0 голосов
/ 03 декабря 2009

Я думаю ММВ ваш друг здесь.

...