2013-01-16 41 views
3

我正在嘗試獲取文件列表並重命名它們,並在文件名中增加一個數字。該目錄包含一個名爲像一堆文件:在bash中增加文件名中的數字

senreg1.csv  senreg2.csv    senreg10.csv 
senreg1.csv.1 senreg2.csv.1   senreg10.csv.1 
senreg1.csv.2 senreg2.csv.2   senreg10.csv.2 
senreg1.csv.3 senreg2.csv.3  ... senreg10.csv.3 
senreg1.csv.4 senreg2.csv.4   senreg10.csv.4 
...    ...      ... 
senreg1.csv.10 senreg2.csv.10   senreg10.csv.10 
senreg1.csv.11 senreg2.csv.11   senreg10.csv.11 

我想增加所有最終在3或更高,所以我可以插入帶有後綴3的新文件中的文件,所以我做了所謂的文本文件「 renames.txt'包含我想重命名的所有文件名。然後,我嘗試使用for循環來進行實際的重命名。

for f in `cat renames.txt` 
do 
    newfile=`echo $f | awk 'BEGIN { FS = "."}; { printf $1 "." $2 "." $3+1 }'` 
    mv "$f" "$newfile" 
done 

我想要的東西,如落得:

senreg1.csv  senreg2.csv    senreg10.csv 
senreg1.csv.1 senreg2.csv.1   senreg10.csv.1 
senreg1.csv.2 senreg2.csv.2   senreg10.csv.2 
senreg1.csv.4 senreg2.csv.4  ... senreg10.csv.4 
senreg1.csv.5 senreg2.csv.5   senreg10.csv.5 
...    ...      ... 
senreg1.csv.11 senreg2.csv.11   senreg10.csv.11 
senreg1.csv.12 senreg2.csv.12   senreg10.csv.12 

而是我得到:

senreg1.csv  senreg2.csv    senreg10.csv 
senreg1.csv.1 senreg2.csv.1   senreg10.csv.1 
senreg1.csv.2 senreg2.csv.2  ... senreg10.csv.2 
senreg1.csv.12 senreg2.csv.12   senreg10.csv.12 

senregX.csv.12的內容是一樣的原始senregX .csv.3。希望這個解釋是有道理的。有人知道這裏發生了什麼?

回答

-1

您需要反向重命名文件。

11 -> 12 
10 -> 11 
9 -> 10 

等等。

0

這個腳本做你想做的,沒有臨時文件,只有有解決方案的多樣性:

#!/bin/bash 
for file in $(ls -1 *[0-9]) # list files ending with a number 
do 
    # get file name and id 
    name=$(echo $file | sed 's/\(.*\)\.\([0-9]\+\)$/\1/g'); 
    id=$(echo $file | sed 's/.*\.\([0-9]\+\)$/\1/g'); 

    if [ $id -ge 3 ] 
    then 
    ((id += 1)) 

    # We need to backup the files because we may override some files 
    cp $file "_$name.$id" 
    fi 
done 


# remove old files 
for file in $(ls -1 [!_]*[0-9]) 
do 
    id=$(echo $file | sed 's/.*\.\([0-9]\+\)$/\1/g'); 

    if [ $id -ge 3 ] 
    then 
    rm $file; 
    fi 
done 


# finish 
for file in $(ls -1 _*[0-9]) 
do 
    name=$(echo $file | tr -d '_'); 
    mv "$file" "$name"; 
done