Rename

用偶數重命名文件

  • December 5, 2014

我有一組圖像,這些圖像是書籍的掃描頁面。它們總共有大約 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

注意:為什麼我%04dsprintf命令中使用,因為當你想重命名為時1-001.png1-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最後,您可以從命令中刪除選項以重命名文件。

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