Linux Bash oneliner重命名文件名
我经常想简单地重命名一堆文件。我总是要与Linux Bash oneliner重命名文件名,linux,bash,perl,file-rename,bash4,find,Linux,Bash,Perl,File Rename,Bash4,Find,我经常想简单地重命名一堆文件。我总是要与find、grep、xargs和sed斗争,才能简单地完成工作。我想了解如何更好地使用PCRE 这是我的文件: $ find . . ./08447.ctags ./10565.gitignore ./38037.inputrc ./42257.bashrc ./51395.gitk ./63705.gitconfig ./66352.octave_hist ./67049.ahk ./85869.vimrc ./89518.minttyrc ./desk
find
、grep
、xargs
和sed
斗争,才能简单地完成工作。我想了解如何更好地使用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/' .
我的替代解决方案是编写以下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]);
#/usr/bin/env perl
使用5.010;
使用File::Find;
死亡“错误的regexp!”除非
$ARGV[0]=~m/^
s(?\/| ~|@| |%| ` | \\|)
(?.*)
(?&分隔符)
(?.*)
(?&分隔符)
(?*)$/x;
我的$search=join(“”,map((?$)”,split(“”,$+{flags}))。$+{search};
我的$replace=''.$+{replace}.'';
查找(sub{rename($\ s/$search/$replace/ree)},$ARGV[1]);
有更好的解决方案吗?有一个简单的解决方案 如果
rename
命令很好,但希望它是递归的,那么:
还有其他同名工具可能无法做到这一点,因此请小心。如果运行以下命令(
linux
)
你得到的结果是
.../rename: Perl script, ASCII text executable
并且不包含ELF
那么这似乎是正确的工具=)
如果不是,将其作为Debian
和类似Ubuntu
的衍生工具的默认值(通常已经是这种情况):
$ sudo update-alternatives --set rename /path/to/rename
(将/path/to/rename
替换为perl的rename
命令的路径
如果没有此命令,请搜索软件包管理器以安装它,或者
最后但并非最不重要的一点是,这个工具最初是由Perl的父亲Larry Wall编写的。重命名命令行的作用是什么?正确重命名是什么意思?文件名上的预期转换是什么?例如,目录列表的示例结果?@sputnick,我从未找到任何关于重命名的文档>命令。即使是
rename--help
或manrename
也不是很有用。我可以使用PCRE吗?@Sobrique,我的意思是“轻松”。一个简单的替换行,带有一些标准选项,如“-r--recursive”等。你知道这是perl吗?非常好,我一直认为这个f***ing重命名工具完全没有用。事实上,我我从来没有使用过正确的工具。如果是拉里写的,它应该符合我的期望:)谢谢。
$ file $(readlink -f $(type -p rename))
.../rename: Perl script, ASCII text executable
$ sudo update-alternatives --set rename /path/to/rename