
У меня есть много папок, которые нужно переименовать на основе нескольких правил. Пример папок:
-- 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, '(')+')')
}