Regular-Expression
替換目錄中所有文件的文件名中的計數器
在將幾個 1000 個文件從相機導入硬碟驅動器後,我意識到,在重命名文件的過程中使用的計數器不是從 0 開始的。這導致文件結構如下:
My vacation 2018-05-03 2345.jpg My vacation 2018-05-03 2346.jpg My vacation 2018-05-04 2347.jpg
我想批量重命名所有這些文件,索引以 0 開頭
My vacation 2018-05-03 0001.jpg My vacation 2018-05-03 0002.jpg My vacation 2018-05-04 0003.jpg
我已經完成了一些處理批量重命名文件和添加計數器/索引(bash 循環)或使用重命名/預命名的主題,但我無法為我的案例找到可行的解決方案。
基本上,我想使用正則表達式將文件名的一部分與描述和日期相匹配,並在
.*(\d\d\d\d\-\d\d\-\d\d){1}
最後添加一個後綴計數器。
\d+.
在文件名中,我們需要用4-0 填充計數器後跟點 —替換一系列數字,後跟點 —sprintf("%04d.", ++$c)
。rename -n -- 'our $c; s/\d+\./sprintf("%04d.", ++$c)/e' *.jpg
對於沒有零填充,我們不需要
sprintf
,而只是連接計數器和點。由於連接運算符也是一個點,rename -n -- 'our $c; s/\d+\./++$c . "."/e' *.jpg
筆記
-n
當確信它工作正常時刪除。在某些發行版
rename
中可能會呼叫perl-rename
.
our $c;
引入以解決“全域符號“$c”需要顯式包名”錯誤。在我的系統中沒有必要…¯\ (ツ) /¯
與
zsh
:$ autoload -Uz zmv $ zmv -n '(* )(<->)(.jpg)' '$1${(l[4][0])$(($2 - 2344))}$3' mv -- 'My vacation 2018-05-03 2345.jpg' 'My vacation 2018-05-03 0001.jpg' mv -- 'My vacation 2018-05-03 2346.jpg' 'My vacation 2018-05-03 0002.jpg' mv -- 'My vacation 2018-05-04 2347.jpg' 'My vacation 2018-05-04 0003.jpg'
(然後,
-n
如果滿意,請刪除(試執行))。對於要求文件名中包含日期的更明確的匹配 (XXXX-XX-XX)
zmv -n '(* [0-9](#c4)(-[0-9](#c2))(#c2) )(<->)(.jpg)' '$1${(l[4][0])$(($3 - 2344))}$4'
或者
zmv -n '(* <1970-2021>-<1-12>-<1-31> )(<->)(.jpg)' '$1${(l[4][0])$(($2 - 2344))}$3'
那些減去 2344 的數字。或者,您可以將它們按順序排列並從 1 開始編號,而忽略已經存在的數字的值。如果您還希望在日期之前的前綴每次更改時重新啟動號碼,您可以執行以下操作:
$ typeset -A n=() $ zmv -n '((*) <1970-2021>-<1-12>-<1-31> )(<->)(.jpg)' '$1${(l[4][0])$((++n[\$2]))}$4' mv -- 'My other vacation 2021-01-05 0044.jpg' 'My other vacation 2021-01-05 0001.jpg' mv -- 'My other vacation 2021-01-05 0045.jpg' 'My other vacation 2021-01-05 0002.jpg' mv -- 'My other vacation 2021-01-05 0046.jpg' 'My other vacation 2021-01-05 0003.jpg' mv -- 'My other vacation 2021-01-05 0047.jpg' 'My other vacation 2021-01-05 0004.jpg' mv -- 'My other vacation 2021-01-05 0048.jpg' 'My other vacation 2021-01-05 0005.jpg' mv -- 'My vacation 2018-05-03 2345.jpg' 'My vacation 2018-05-03 0001.jpg' mv -- 'My vacation 2018-05-03 2346.jpg' 'My vacation 2018-05-03 0002.jpg' mv -- 'My vacation 2018-05-04 2347.jpg' 'My vacation 2018-05-04 0003.jpg'