Найдите команду rename(1)
.Есть несколько различных вариантов, но все они поддерживают какое-то переименование, основанное на регулярных выражениях.Версия, которую я использую (на основе кода из первого издания Perl «Camel Book») будет использоваться как:
rename 's%ABC%DEF%g' ...
Или, например,
find . -print0 | xargs -0 rename s/ABC/DEF/g
Или, чтобы избежать проблем с изменением путей при обходе структуры каталогов, сначала выполните имена каталогов, а затем файлы (как в вопросе):
find . -type d -print0 | xargs -0 rename s/ABC/DEF/g
find . -type f -print0 | xargs -0 rename s/ABC/DEF/g
Могут быть проблемы с переименованием каталоговпо ходу дела (поскольку после того, как вы переименовали ./ABC
в ./DEF
, вы больше не можете переименовывать ./ABC/subABC/
в ./DEF/subDEF
, поскольку каталог теперь ./DEF/subABC
).
Другие версии rename
имеют разные синтаксисы - проверьте страницы справочника.
Здесь приведена версия rename
для Perl, основанная на первом издании Perl 'Camel Book';первая версия под контролем версий имеет дату 1992-01-05.Сегодняшнее изменение обновило строку shebang (использует env, удалено -w
, поскольку оно ненадежно, и добавлено use warnings;
, чтобы компенсировать отсутствие -w
).Предыдущие изменения были в 2008, 1998, 1996 и 1992 годах;за последние 19 лет он не сильно изменился.
#!/usr/bin/env perl
#
# @(#)$Id: rename.pl,v 1.8 2011/06/03 22:30:22 jleffler Exp $
#
# Rename files using a Perl substitute or transliterate command
use strict;
use warnings;
use Getopt::Std;
my(%opts);
my($usage) = "Usage: $0 [-fnxV] perlexpr [filenames]\n";
my($force) = 0;
my($noexc) = 0;
my($trace) = 0;
die $usage unless getopts('fnxV', \%opts);
if ($opts{V})
{
printf "%s\n", q'RENAME Version $Revision: 1.8 $ ($Date: 2011/06/03 22:30:22 $)';
exit 0;
}
$force = 1 if ($opts{f});
$noexc = 1 if ($opts{n});
$trace = 1 if ($opts{x});
my($op) = shift;
die $usage unless defined $op;
if (!@ARGV) {
@ARGV = <STDIN>;
chop(@ARGV);
}
for (@ARGV)
{
if (-e $_ || -l $_)
{
my($was) = $_;
eval $op;
die $@ if $@;
next if ($was eq $_);
if ($force == 0 && -f $_)
{
print STDERR "rename failed: $was - $_ exists\n";
}
else
{
print "+ $was --> $_\n" if $trace;
print STDERR "rename failed: $was - $!\n"
unless ($noexc || rename($was, $_));
}
}
else
{
print STDERR "$_ - $!\n";
}
}