Скрипт для очистки имен папок

Скрипт для очистки имен папок

У меня есть много папок, которые нужно переименовать на основе нескольких правил. Пример папок:

-- Some.Folder.Name.Today.2009
-- Another.messed.Up.folder.1980
-- Third.messed.Up.folder.1980

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

-- Some Folder Name Today (2009)
-- Another messed Up folder (1980)
-- Third messed Up folder (1980)

Большое спасибо!

решение1

Перлсправляется с этим хорошо, чего-то вроде этого должно быть достаточно:

use warnings;
use strict;
use File::Copy;

my $oldname;

opendir(my $d, ".") or die $!;
while(readdir $d) {
    if (-d $_ and $_ ne "." and $_ ne "..")
    {
        $oldname = $_;
        $_ =~ s/\./ /g;
        $_ =~ s/(\d{4})/($1)/g;
        move($oldname,$_);
    }
    }
closedir $d;

Только что протестировал, не стесняйтесь его гольфить/модифицировать! Он ни в коем случае не идеален. Быстро его собрал ;)

Примечание:В текущем состоянии его следует запускать из каталога с искаженными именами папок.

C:\Users\John\Desktop\folders>каталог
 Том на диске C не имеет метки.
 Серийный номер тома: 8888-1666

 Каталог C:\Users\John\Desktop\folders

29/01/2011 07:14 PM .
29/01/2011 07:14 PM ..
29/01/2011 07:07 PM имя.папки.2008
29/01/2011 07:07 PM имя.папки.2009
29/01/2011 07:16 PM 282 ren.pl
               1 Файл(ы) 282 байта
               4 Dir(s) 53,349,425,152 байт свободно

C:\Users\John\Desktop\folders>ren.pl

C:\Users\John\Desktop\folders>каталог
 Том на диске C не имеет метки.
 Серийный номер тома: 8888-1666

 Каталог C:\Users\John\Desktop\folders

29/01/2011 07:16 PM .
29/01/2011 07:16 PM ..
29/01/2011 07:07 PM имя какой-то папки (2008)
29/01/2011 07:07 PM имя какой-то папки (2009)
29/01/2011 07:16 PM 282 ren.pl
               1 Файл(ы) 282 байта
               4 Dir(s) 53,349,425,152 байт свободно

решение2

Я бы предложил пропустить имена файлов через короткий скрипт sed. for file in dir/with/files/*; do name=$(basename "$file" | sed 's/\./ /g;s/\([12][09][0-9][0-9]\)/(\1)/'); mv "$file" "$(dirname \"$file\")/$name"; doneЗаменяет точки пробелами, а затем заключает год в скобки.

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

решение3

ВPowerShell(который, как я полагаю, установлен по умолчанию в Win7, хотя у меня нет машины с Windows, так что я могу ошибаться),

gci *.* | %{
 mi $_ ($_.name.replace('.', ' ').insert($_.name.lastindexof('.')+1, '(')+')')
}

Связанный контент