Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Bash oneliner重命名文件名_Linux_Bash_Perl_File Rename_Bash4_Find - Fatal编程技术网

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