Rename

用連續的數字重命名文件

  • February 3, 2019

我有大約一千個文件,看起來都像這樣:

20091208170014.nc              
20091211150704.nc  
20091214131328.nc  
20091217111953.nc  
20091220092643.nc  
20091223073308.nc  
20091226053932.nc  
20091229034557.nc
20091208171946.nc              
20091211152610.nc

前八位是日期,後六位是連續數字,但這些數字之間的差異在文件之間並不相同。我希望最後六個數字是連續的並且始終使用相同的步驟。例如:

20091208000001.nc              
20091211000002.nc  
20091214000003.nc  
20091217000004.nc  
20091220000005.nc  
20091223000006.nc  
20091226000007.nc  
20091229000008.nc
20091208000009.nc              
20091211000010.nc

我使用https://www.ostechnix.com/how-to-rename-multiple-files-at-once-in-linux/mmv等其他問題檢查了該站點上的幾個問題,但沒有一個可以向我解釋如何擁有我名字中的連續數字。

為了將此與問題Batch rename files to a sequence numbering區分開來,順序排序必須基於最後六位數字,完全忽略前八個字元中的嵌入日期。

如果您安裝了perl基於- 的rename工具,有時稱為prename,您可以在一行中執行此操作,如下所示

rename -n 's/^(.{8})(.{6})\.(.*)/sprintf "%s%06d.%s", $1, ++$a, $3/e' *.nc

正如所寫的,它只會告訴你它會做什麼。當您滿意時,刪除-n以靜默執行,或將其替換為-v以查看發生了什麼。

如果您好奇,這會將三個(..)部分(其中.{n}代表n字元,.*代表任何東西,括號創建一個分組)替換為包含第一組和遞增的六位數字的格式化列印的結果。(不使用第二組。)第三組跨越文件副檔名。

我應該注意它會拒絕覆蓋現有文件。

樣本輸出

20091208170014.nc renamed as 20091208000001.nc
20091208171946.nc renamed as 20091208000002.nc
20091211150704.nc renamed as 20091211000003.nc
20091211152610.nc renamed as 20091211000004.nc
20091214131328.nc renamed as 20091214000005.nc
20091217111953.nc renamed as 20091217000006.nc
20091220092643.nc renamed as 20091220000007.nc
20091223073308.nc renamed as 20091223000008.nc
20091226053932.nc renamed as 20091226000009.nc
20091229034557.nc renamed as 20091229000010.nc

您似乎希望根據文件名的最後六位數字排序,完全忽略嵌入的日期。這裡有幾個選項。

  1. 如果您的文件足夠少,shell 可以完全擴展列表,則對文件進行排序:
rename -n '..as above..' $(ls -d *.nc | sort -k1.9,1.14n)
  1. 執行轉換,使排序鍵暫時放在文件名的前面,然後重命名,然後替換它所屬的位置:
# Swap the first eight and second six groups around
rename -n 's/^(.{8})(.{6})\.(.*)/$2$1.$3/' *.nc

# Apply the transform with the shell sorting by original sequence
rename -n 's/^(.{6})(.{8})\.(.*)/sprintf "%06d%s.%s", ++$a, $2, $3/e' *.nc

# Swap back the first six and second eight groups
rename -n 's/^(.{6})(.{8})\.(.*)/$2$1.$3/' *.nc

和以前一樣,刪除-n以靜默執行或將其替換為-v以查看實際發生的情況。

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