2010-04-19 70 views
4

如何替换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\"`;}' 

感谢您的帮助!

+0

谢谢大家谁回答,非perl的解决方案为我工作最好的。我有一些破折号去除,并且当我用_替换_时,它也很好。 – dannyb 2010-04-19 02:07:20

回答

2

,如果你是在* 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

这工作,我不得不删除“回声”它的工作,谢谢! – dannyb 2010-04-19 01:58:40

+0

小修改。如果你只想要文件夹,就放下斜线。请参阅编辑。 – ghostdog74 2010-04-19 02:07:19

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

涂展开一行程序:

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 
} 
3

Linux有一个rename命令:

rename '-' ' ' Photos_* 
相关问题