gpt4 book ai didi

linux - Bash oneliner 重命名文件名

转载 作者:太空狗 更新时间:2023-10-29 12:03:05 27 4
gpt4 key购买 nike

我经常想轻松地重命名一堆文件。我总是不得不努力使用 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/' .

我的替代解决方案是编写以下 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]);

有没有更好的解决方案?

最佳答案

有一个简单的解决方案。

如果您的 rename 命令没问题,但您希望它递归,那么:

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

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

warning 有其他同名工具可能无法执行此操作,所以要小心。

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

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

你有一个类似的结果

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

并且不包含ELF

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

如果不是,让它成为 DebianUbuntu 等衍生产品的默认设置(通常已经是这样):

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

(将 /path/to/rename 替换为您的 perl 的 rename 命令的路径。


如果你没有这个命令,搜索你的包管理器来安装它或者 do it manually


最后但同样重要的是,这个工具最初是由 Perl 之父 Larry Wall 编写的。

关于linux - Bash oneliner 重命名文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27651307/

27 4 0
文章推荐: html - 用显示 :table-cell 填充可用空间
文章推荐: javascript - HTML/JavaScript : Simple form validation on submit
文章推荐: html - 使用 list-style-type :none 删除
文章推荐: html - 如何链接到另一个页面上的
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com