2009-03-10 2 views
1

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

/photos/1/original/filename1.jpg 
/photos/1/thumb/filename1.jpg 
/photos/2/original/filename2.jpg 
/photos/2/thumb/filename2.jpg 
/photos/3/original/filename3.jpg 
/photos/3/thumb/filename3.jpg 

... и т.д.. Я ищу регулярное выражение для преобразования структуры файла/каталога в:

/photos/1/original.jpg 
/photos/1/thumb.jpg 
/photos/2/original.jpg 
/photos/2/thumb.jpg 
/photos/3/original.jpg 
/photos/3/thumb.jpg 

... и т. Д. У меня есть сценарии для переименования файлов в ruby ​​или perl ... просто отсутствует соответствующее регулярное выражение.

Спасибо за любую помощь заранее!

ответ

2

Perl решение

$newfn = $oldfn; 
$newfn =~ s/(original|thumb)[^\.]*/$1/; 
rename($oldfn, $newfn); 

В соответствии с просьбой, чтобы соответствовать любому ключевому слову, а не только "оригинал" или "большого пальца", если предположить, что/фотографии/пп остается прежним:

$newfn = $oldfn; 
$newfn =~ s?(photos/\d+/[^/]*)/[^\.]*?$1?; 
rename($oldfn, $newfn); 

Адаптивная это решение также удалит каталоги, если они пустые

$newfn = $oldfn; 
$newfn =~ s?(/photos/\d+/)([^/]*)/[^\.]*?$1$2?; 
rename($oldfn, $newfn); 
unlink($1$2); 

Я не уверен, что это будет если каталог не пуст, когда вы его отключите.

+0

Можете ли вы предложить более общее решение? Итак, если, скажем, было больше имен папок, чем просто большого пальца или оригинала, можно ли было бы изменить ваш exp на учет для любых имен папок x? Спасибо, Пол. – Mike

+0

Это делает работу в первую очередь? –

+0

Собственно, нет. Теперь, когда я его протестировал, он ничего не делает ... – Mike

1

Адаптирование решения Пола Tomblin и обеспечивая более общее переименование:

my $newfn = $oldfn; 
$newfn =~ s%(/\d+/[^/]+)/[^/]+(\.[^./]+)$%$1$2%; 

Давайте расширять, что с помощью опции 'х': (. Непроверенные - там может быть опечатки)

$newfn =~ s% 
       (    # start remembering 
       /\d+/   # /397/ 
       [^/]+   # original, thumb, othername, ... 
       )    # stop remembering 
       /   # directory 
       [^/]+   # filename within directory 
       (\.[^./]+)$ # remember extension matching to end of name 
      % 
       $1$2   # /397/original.png 
      %x; 

2

Вот рубиновый раствор:

require 'fileutils' 

old_file = "/photos/1/original/filename1.jpg" 
new_file = old_file.sub(/(\d+)\/(\w+)\/.+(\.\w+)/, '\1/\2\3') 
FileUtils.mv(old_file, new_file) 
0

Примечание. Хотя это не дает прямого ответа на ваш вопрос, я думаю, вы все равно найдете это полезным. Linux и cygwin имеют команды «rename» и «mmv» (несколько шагов), которые могут удовлетворить эту потребность. С учетом структуры каталогов и ваш запрос, вы можете тривиальным использовать команду rename, чтобы решить эту проблему:

cd /photos/1/original 
rename filename original *.jpg 
mv *.jpg .. 
cd ../thumb 
rename filename thumb *.jpg 
mv *.jpg .. 
cd ../2 
    .... (repeat for other directories) 

Вы должны проверить страницу человека для mmv, но похоже, что вы можете сделать что-то подобное (это не тестировался):

cd /photos 
mmv "*/original/filename*.jpg" "./#1/original#2.jpg" 
mmv "*/thumb/filename*.jpg" "./#1/thumb#2.jpg" 

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

Смежные вопросы