
我想使用 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}'