簡體   English   中英

Bash oneliner重命名文件名

[英]Bash oneliner to rename filenames

我經常想輕松地重命名一堆文件。 我總是不得不為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/' {} +

警告 還有其他相同名稱的工具可能無法執行此操作,因此請小心。

如果運行以下命令( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM