Заменить текст в именах папок - PullRequest
4 голосов
/ 19 апреля 2010

Как заменить тот же текст в именах папок в Linux?

Допустим, у меня есть "Photos_Jun", "Photos_July", "Photos_Aug" и т. Д. Какой самый простой способ, которым я могу переименовать их в "Photos Jun", "Photos July" и т. Д. (В основном я хочу заменить подчеркивание на пробел "". У меня около 200 таких папок.

Я искал решение: Как я могу легко переименовать файлы с помощью Perl?

Похоже на то, что я ищу, однако я не знаю, как создать регулярное выражение для сопоставления буквенно-цифровых папок, за которыми следует "_".

Все файлы имеют нечисловые имена, поэтому я думаю, что [a-zA-Z] - правильный путь для начала.

perl -e 'foreach $f (glob("File\\ Name*")) { $nf = $f; $nf =~ s/(\d+)$/sprintf("%03d",$1)/e; print `mv \"$f\" \"$nf\"`;}'

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

Ответы [ 3 ]

3 голосов
/ 19 апреля 2010

Linux имеет команду rename:

rename '-' ' ' Photos_*
2 голосов
/ 19 апреля 2010

, если вы используете * nix и не против решения Perl, вот решение для оболочки (bash). удалите echo, когда будете удовлетворены.

#!/bin/bash
shopt -s extglob
for file in +([a-zA-Z])*_+([a-zA-Z])/; do echo mv "$file" "${file//_/ }"; done
0 голосов
/ 19 апреля 2010
perl -e 'use File::Copy; foreach my $f (glob("*")) { next unless -d $f; my $nf = $f; $nf =~ s/_/ /g; move($f, $nf) || die "Can not move $f to $nf\n"; }

Ту разверни однострочник:

use strict; # Always do that in Perl. Keeps typoes away.
use File::Copy; # Always use native Perl libraries instead of system calls like `mv`
foreach my $f (glob("*")) {
    next unless -d $f; # Skip non-folders
    next unless $f =~ /^[a-z_ ]+$/i; # Reject names that aren't "a-zA-Z", _ or space
    my $new_f = $f; 
    $new_f =~ s/_/ /g; # Replace underscore with space everywhere in string
    move($f, $nf) || die "Can not move $f to $nf: $!\n";
                     # Always check return value from move, report error
}
...