Bash oneliner重命名文件名

我经常想轻松重命名一堆文件。 我总是不得不努力findgrepxargssed来简单地工作。 我想了解如何使用PCRE做得更好

在这里我的文件:

 $ find . . ./08447.ctags ./10565.gitignore ./38037.inputrc ./42257.bashrc ./51395.gitk ./63705.gitconfig ./66352.octave_hist ./67049.ahk ./85869.vimrc ./89518.minttyrc ./desktop.ini ./dp4FontViewer64.exe ./SBZSwitcher_v1.8.9.7z ./xlive.rar 

我会正确地重命名点文件,因为我可以用这个oneliner:

 $ find . | grep -e '^[.]\/[0-9]\+[.]' | sed -r 's/^.*[.](\w+)$/\0 .\1/' | xargs -n2 mv 

然而,我觉得这个命令非常复杂,我正在寻找一些我可以轻松使用的东西:

 $ rename 's/^\.\/\d+\.(\w+)$/\1/' . 

我的替代解决scheme是编写这个Perl脚本:

 #!/usr/bin/env perl use 5.010; use File::Find; die "Wrong regexp!" unless $ARGV[0] =~ m/^ s(?<delimiter>\/|~|@|;|%|`|\|) (?<search>.*) (?&delimiter) (?<replace>.*) (?&delimiter) (?<flags>.*)$/x; my $search = join('', map("(?$_)", split('', $+{flags}))).$+{search}; my $replace = '"'.$+{replace}.'"'; find(sub { rename($_, s/$search/$replace/ree) }, $ARGV[1]); 

有没有更好的解决scheme?

有一个简单的解决方案。

如果您的rename命令是好的,但你想递归,那么:

bash4

 shopt -s globstar rename 's/^\.\/\d+\.(\w+)$/\1/' ** 

 find -type f -exec rename 's/^\.\/\d+\.(\w+)$/\1/' {} + 

警告http://img.zgserver.com/linux/1377510865.png 还有其他的工具可能会也可能不会做到这一点,所以要小心。

如果你运行下面的命令( linux

 $ file $(readlink -f $(type -p rename)) 

你有一个像这样的结果

 .../rename: Perl script, ASCII text executable 

不包含ELF

那么这似乎是正确的工具=)

如果没有,在Debian和衍生工具(如Ubuntu )上将其设为默认(通常已经是这种情况):

 $ sudo update-alternatives --set rename /path/to/rename 

(替换/path/to/rename您的perl's rename命令的路径。


如果你没有这个命令,搜索你的软件包管理器来安装它或手动执行


最后但并非最不重要的是,这个工具最初是由Perl的爸爸Larry Wall编写的。