2017-02-17 65 views
2

我有一個像連續追加號碼爲文件名

Ortho234.phy 
Ortho671.phy 
Ortho880.phy and so on 

文件列表,我想爲陣列作業重命名爲

Ortho234.1.phy 
Ortho671.2.phy 
Ortho880.3.phy 

我試過,但這種替換,只是名稱該文件爲1.phy,2.phy等。

a=1 
for i in *.phy; do 
    new=$(printf "%04d.phy" "$a") 
    mv -- "$i" "$new" 
    let a=a+1 
done 
+1

輸入文件'i'是您的文件名和你沒有使用它。 – Arijoon

+0

就我個人而言,我覺得你有一個x <->問題,因爲你沒有通過重命名文件而獲得任何好處,並且最好向你的實際陣列問題尋求幫助。文件仍然與添加新號碼之前的順序相同。 – grail

回答

5

以下命令的任何人會做你的工作

c=0 rename 's/\./sprintf(".%d.",++$ENV{c})/e' *.phy 

rename 's/\./".".++$a."."/e' *.phy     

rename '$a++; s/\./.$a./e' *.phy     

n=1;for f in *.phy; do mv "$f" "${f%.*}.$n.${f##*.}"; n=$((n+1)); done 

要麼

它執行perl s///表達,並從 原來以進行重命名替換字符串。在替換字符串我用 sprintf格式化的名字,在這裏我使用環境變量c作爲 計數器

$ touch Ortho234.phy Ortho671.phy Ortho880.phy 

$ ls *.phy -1 
Ortho234.phy 
Ortho671.phy 
Ortho880.phy 

$ c=0 rename 's/\./sprintf(".%d.",++$ENV{c})/e' *.phy 

$ ls *.phy -1 
Ortho234.1.phy 
Ortho671.2.phy 
Ortho880.3.phy 

OR

$ touch Ortho234.phy Ortho671.phy Ortho880.phy 

$ ls *.phy -1 
Ortho234.phy 
Ortho671.phy 
Ortho880.phy 

$ n=1;for f in *.phy; do mv "$f" "${f%.*}.$n.${f##*.}"; n=$((n+1)); done 

$ ls *.phy -1 
Ortho234.1.phy 
Ortho671.2.phy 
Ortho880.3.phy 

OR

$ touch Ortho234.phy Ortho671.phy Ortho880.phy 

$ ls *.phy -1 
Ortho234.phy 
Ortho671.phy 
Ortho880.phy 

$ rename 's/\./".".++$a."."/e' *.phy 

$ ls *.phy -1 
Ortho234.1.phy 
Ortho671.2.phy 
Ortho880.3.phy 

OR

$ touch Ortho234.phy Ortho671.phy Ortho880.phy 

$ ls *.phy -1 
Ortho234.phy 
Ortho671.phy 
Ortho880.phy 

$ rename '$a++; s/\./.$a./e' *.phy 

$ ls *.phy -1 
Ortho234.1.phy 
Ortho671.2.phy 
Ortho880.3.phy 
+0

我挑選2號門! (可移植性++)...如果刪除[ParsingLS](http://mywiki.wooledge.org/ParsingLs)選項,我會贊成。 :-) – ghoti

+0

也可以使用'rename's /\./".".++$ a。「。」/ e'* .phy'或'rename'$ a ++; s /\./".$ a。「/ e'* .phy',利用[sort global variables](https:// stackoverflow。com/questions/26127617/what-exactly-a-and-b-in-perls-sort-function) – Sundeep

+1

@ghoti:刪除了對建議的感謝 –

1

這應該做的工作:

filepart是文件名,不帶擴展名。

1
awk -F\. '{print $1"."NR"."$2}' file 

Ortho234.1.phy 
Ortho671.2.phy 
Ortho880.3.phy 
1

awk指令還有助於獲得所需的輸出。 NR給出的行號和上.分割輸入和陣列重寫按所需要的像以下

awk '{split($0,a,"."); print a[1]"."NR"."a[2]}' file 

文件是包含下列值

Ortho234.phy 
Ortho671.phy 
Ortho880.phy 
+0

awk可以讀取Input_file本身無需使用cat Input_file | awk ....命令然後。它通常被稱爲UUOC(無用的cat命令)。 – RavinderSingh13