Пакетное переименование файлов с использованием имени каталога с регулярным выражением - PullRequest
1 голос
/ 10 марта 2009

Учитывая следующую структуру файлов / каталогов:

/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 ... просто отсутствует правильное регулярное выражение.

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

Ответы [ 4 ]

2 голосов
/ 10 марта 2009

Вот рубиновое решение:

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)
2 голосов
/ 10 марта 2009

Perl решение

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

По запросу, чтобы соответствовать любому ключевому слову, а не только «оригиналу» или «большому пальцу», при условии, что / photos / nn остается тем же:

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

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

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

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

1 голос
/ 10 марта 2009

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

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

Давайте расширим это с помощью опции 'x':

$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;

(Не проверено - возможны опечатки).

0 голосов
/ 10 марта 2009

Примечание. Хотя это не дает прямого ответа на ваш вопрос, я думаю, вы все равно найдете это полезным. 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"

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

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