[英]Bash oneliner to rename filenames
我經常想輕松地重命名一堆文件。 我總是不得不為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]);
有更好的解決方案嗎?
有一個簡單的解決方案。
如果您的rename
命令很好,但是您希望它是遞歸的,則:
shopt -s globstar
rename 's/^\.\/\d+\.(\w+)$/\1/' **
find -type f -exec rename 's/^\.\/\d+\.(\w+)$/\1/' {} +
如果運行以下命令( 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編寫的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.