Переименование нулевой площадки, например Изображение (2) .jpg -> Изображение (002) .jpg - PullRequest
2 голосов
/ 30 декабря 2010

Мне нужно переименовать все изображения, как объясняет заголовок во всех подпапках. Я подумываю извлечь с помощью регулярного выражения число в скобках, а затем переименовать его. Осматривая вокруг, я обнаружил, что есть такие инструменты, как rename и mmv, но я не смог заставить их переименовать jpgs.

Буду признателен за любые советы по решению моей проблемы.

Кстати: для Windows, и у меня есть Cygwin Bash и Perl.

Edit:
Выводы после экспериментов со всеми ответами.

  1. Cygwin rename нехорошо, тот, кого я мог заставить работать, не принимает регулярные выражения, но, безусловно, хороший вариант, например, запустив виртуальную машину Linux и смонтировав Win SharedFolder.
  2. Вы можете создать лучший инструмент rename для Cygwin с помощью этого сценария оболочки , используя sed.
  3. Эквивалент Windows для pwd просто cd.
  4. Hugmeir опубликовал многообещающее решение с использованием Perl 5.13+, которые являются версиями для разработчиков, но к тому времени, когда вы будете читать это, возможно, это будет стабильно.
  5. Саб pad_left не может быть лучшей альтернативой синтаксису printf, но он работает.

Ответы [ 4 ]

7 голосов
/ 30 декабря 2010

Команда rename может сделать это:

rename 's/\d+/sprintf("%03d",$&)/e' *.jpg

С подкаталогами:

find . -type f -name \*.jpg -print0|xargs -0 rename 's/\d+/sprintf("%03d",$&)/e'
1 голос
/ 30 декабря 2010
perl -MFile::Find::Rule -E 'rename($_, s/ \( \K ([0-9]+) (?= \) ) / sprintf("%03s", $1) /rex) for File::Find::Rule->file->name("*.jpg")->in($ARGV[0])' directory_here

Это будет работать только с 5,13 + Perls, хотя, из-за флага / r.

РЕДАКТИРОВАТЬ: Для Windows вам придется изменить внешние кавычки с двойными кавычками, и либо экранироватьте, что указаны в sprintf и name, или используйте другой разделитель, ala qq!% 03d!

EDIT2: Вау, я полностью облажался с разделителями.

1 голос
/ 30 декабря 2010

приведенный ниже код был протестирован в Linux; Я не знаю, что вам, возможно, придется изменить, чтобы заставить его работать в вашей среде. Кроме того, я не включил поиск подкаталогов для файлов .jpg; если вы хотите, чтобы я изменил код таким образом, пожалуйста, дайте мне знать.

( РЕДАКТИРОВАТЬ: для поиска по подкаталогам, см. Версию программы ниже)

use strict;
use warnings;

sub pad_left {
   my $num = shift;

   if ($num < 10) {
      $num = "00$num";
   }
   elsif ($num < 100) {
      $num = "0$num";
   }

   return $num;
}

my @files = glob "*.jpg";

my @padded_names = map {
                          my $name = $_;
                          $name =~ s/^([\w ]+\()(\d+)\)/$1 . &pad_left($2) .')'/e;
                          $name;
                       } @files;

foreach (0..$#files) {
   rename($files[$_], $padded_names[$_]);
   print "$files[$_] --> $padded_names[$_]\n";
}

Вышеуказанная программа переименовывает файлы и печатает следующее:

file(1).jpg --> file(001).jpg
file(2).jpg --> file(002).jpg
file(20).jpg --> file(020).jpg
file(200).jpg --> file(200).jpg

НТН

РЕДАКТИРОВАТЬ: Вот улучшенная версия вышеуказанной программы - теперь она также включает в себя поиск в подкаталогах для файлов .jpg. Я знаю, что мой код больше не требуется, так как к настоящему времени дан ответ на проблему подкаталога, но эй ...:)

use strict;
use warnings;
use File::Find;

sub pad_left {
   my $num = shift;

   if ($num < 10) {
      $num = "00$num";
   }
   elsif ($num < 100) {
      $num = "0$num";
   }

   return $num;
}

sub new_name {
   if (/\.jpg$/) {
      my $name = $File::Find::name;
      my $new_name;
      ($new_name = $name) =~ s/^(.+\/[\w ]+\()(\d+)\)/$1 . &pad_left($2) .')'/e;
      rename($name, $new_name);
      print "$name --> $new_name\n";
   }
}

chomp(my $localdir = `pwd`);# invoke the script in the parent-directory of the
                            # image-containing sub-directories

find(\&new_name, $localdir);
0 голосов
/ 01 января 2011

Опять по тангенциальному пути, если вы работаете в Windows, и ваша цель - переименовать файлы, а не заниматься программированием), попробуйте бесплатную программу Siren (http://www.scarabee -software.net / ru / siren.html). что требуется, например попробуйте следующее выражение Image \(%N1{3}\).%le. В частности, обратите внимание на %X* выражения, специально предназначенные для изображений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...