用偶數重命名文件
我有一組圖像,這些圖像是書籍的掃描頁面。它們總共有大約 10,000 頁。這些書是雙語印刷的,正文和翻譯在對頁上。譯文已被丟棄,只有原文頁數,即偶數頁。
我需要文件名包含正確的頁碼,而目前它們的順序很簡單。樂於使用
rename
或類似。為了明確起見,我們目前有以下形式的文件編號:
1-001.png 1-002.png 1-003.png ...
其中第一個數字 1 是卷號;這將保持不變。第二個數字是頁碼,因此需要更改:
1-002.png 1.004.png 1-006.png ...
這是重命名命令:
rename -n 'our $i=2;s/^(\d+)-(\d+)/sprintf("$1-%04d", $i*$2)/e' *.png
結果:
1-001.png renamed as 1-0002.png 1-002.png renamed as 1-0004.png 1-003.png renamed as 1-0006.png 1-004.png renamed as 1-0008.png 1-005.png renamed as 1-0010.png ... 2-001.png renamed as 2-0002.png 2-002.png renamed as 2-0004.png 2-003.png renamed as 2-0006.png 2-004.png renamed as 2-0008.png 2-005.png renamed as 2-0010.png
-n,--無行為 無操作:顯示哪些文件將被重命名。
our $i
我定義了一個perl 全域變數,並用2
.
(\d+)-(\d+)
:(\d+)
將文件名的開頭與一個或多個數字匹配,並將其作為組擷取和一個-
;然後再次(\d+)
匹配文件名中破折號(-
)之後的任何數字,並將其作為組擷取。
^
在開頭^(\d+)-(\d+)
確保避免/跳過重命名文件,如果它們不是^
帶有數字的 start(),a11.001.png
並且僅當文件以 . 開頭時才重命名文件digit-digit.png
。
sprintf("$1-%04d", $i*$2)``$1
:首先使用索引(或其反向引用)列印組擷取(請參閱第一個)(\d+)
,然後列印具有最大 4 個欄位寬度^(\d+)-(\d+)
的組的新計算值( )並用 0s()填充空欄位。$2``%4d``%04d
注意:為什麼我
%04d
在sprintf
命令中使用,因為當你想重命名為時1-001.png
,1-002.png
文件1-002.png
已經存在並且你不能重命名它。所以我在第二個欄位的前面添加了一個額外的零來避免這個錯誤。或者正如@muru 建議的那樣,您可以使用反向引用而不是全域變數
rename -n 's/^(\d+)-(\d+)/sprintf("$1-%04d",$2*2)/e' *.png
$1
是 first(\d+)
的$2
反向引用,是 second 的反向引用(\d+)
。請注意,您必須使用一對括號(group)
將其作為組擷取。
-n
最後,您可以從命令中刪除選項以重命名文件。