替换文件夹名称中的文本

时间:2010-04-19 01:38:47

标签: regex perl search replace directory

如何在linux中替换文件夹名称中的相同文本?

说我有“Photos_Jun”,“Photos_July”,“Photos_Aug”等等,我最简单的方法是将它们重命名为“照片君”,“照片七月”等等(基本上我想用一个替换下划线空间“”。我有大约200个这样的文件夹。

我正在寻找解决方案:How can I easily bulk rename files with 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 个答案:

答案 0 :(得分:3)

Linux有一个rename命令:

rename '-' ' ' Photos_*

答案 1 :(得分:2)

如果您使用的是* nix并且您不介意非Perl解决方案,那么这是一个shell(bash)解决方案。满意后删除echo

#!/bin/bash
shopt -s extglob
for file in +([a-zA-Z])*_+([a-zA-Z])/; do echo mv "$file" "${file//_/ }"; done

答案 2 :(得分:0)

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"; }

Tu展开单行:

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
}