使用 Bash 腳本重命名多個文件

使用 Bash 腳本重命名多個文件

我想使用 Bash 腳本重命名同一目錄中的多個檔案。文件名稱如下:

file2602201409853.p
file0901201437404.p  
file0901201438761.p  
file1003201410069.p  
file2602201410180.p

我想重新命名為以下格式:

file2503201409853.p
file2503201437404.p  
file2503201438761.p  
file2503201410069.p  
file2503201410180.p

我正在閱讀有關重命名命令的信息,並嘗試這樣做,但它什麼也沒做,我想我對語法有疑問。然後我讀到你可以使用MV命令如下:

for file in cmpsms*2014*.p; do
    mv "$file" "${file/cmpsms*2014*.p/cmpsms25032014*.p}"
done

但我無法重命名這些文件。我究竟做錯了什麼?

答案1

您首先考慮重命名是正確的。如果您不習慣正規表示式,語法會有點奇怪,但一旦您知道自己在做什麼,它就是迄今為止最快/最短的路線:

rename 's/\d{4}/2503/' file*

這只是匹配前 4 個數字並將它們交換為您指定的數字。

和一個測試工具(-vn意味著冗長但不任何東西)使用你的檔案名稱:

$ rename 's/\d{4}/2503/' file* -vn
file0901201437404.p renamed as file2503201437404.p
file0901201438761.p renamed as file2503201438761.p
file1003201410069.p renamed as file2503201410069.p
file2602201409853.p renamed as file2503201409853.p
file2602201410180.p renamed as file2503201410180.p

答案2

這應該可以解決問題:

for f in file*; do mv $f ${f/${f:4:8}/25032014}; done

它將第 4 個和第 12 個字元之間的字串替換為“25032014”。

答案3

這確實是@Eric 上面的答案 - 但這是一個優雅的答案,所以我將其重新發佈為正確的答案,以引起更多關注。

for f in *Huge*; do mv "$f" "${f/Huge/Monstrous}"; done

答案4

一種簡單的本機方法,無需循環即可完成此操作,目錄遍歷:

find -type f | xargs -I {} mv {} {}.txt

它將重命名每個文件。

下面是一個工作範例平行化:

find -name "file*.p" | parallel 'f="{}" ; mv -- {} ${f:0:4}2503${f:8}'

相關內容