Regular-Expression

替換目錄中所有文件的文件名中的計數器

  • November 9, 2021

在將幾個 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'

引用自:https://unix.stackexchange.com/questions/676523