2010-09-11 115 views
4

我想從文件(使用bash腳本)更改文件名後綴,但有時文件有一個句點,一些有兩個。更改文件名後綴(使用sed?)

現在我用這個:

new_file=`echo ${file} | sed 's/\(.*\.log.*\)'${suf}'/\1.'${num}'/'` 

其中 'NEW_FILE' 爲新的文件名, '文件' 的原始文件名, '$ {SUF}' 該文件的後綴,$ {num}個新數。

所以some.log必須成爲some.log.1some.log.1必須成爲some.log.2。用我的代碼some.log變成some.log.1,但是some.log.1仍然some.log.1

我希望我很清楚。我很欣賞任何建議(即使不使用sed)。

更新:

@paxdiablo。測試我認爲出了問題。

現在我用這段代碼作爲測試;

#!/usr/bin/bash 

     shft() { 
      for suff in {6..1} ; do 
       if [[ -f "$1.${suff}" ]] ; then 
        ((nxt = suff + 1)) 
        echo Moving "$1.${suff}" to "$1.${nxt}" 
        mv -f "$1.${suff}" "$1.${nxt}" 
       fi 
      done 
      echo Moving "$1" to "$1.1" 
      mv -f "$1" "$1.1" 
     } 

     clear 

     folder=~/logs/*.log 

     for i in {1..20}; do 
      echo ${i}> ~/logs/some.log 

      for fspec in ${folder} ; do 
        shft "${fspec}" 
      done 
     done 

現在,每件事情都很好。對困惑感到抱歉。

+1

允許建議更好的命名方案避免頭痛。例如,'some.log'變成'some.log.20100911-013024';下一個'some.log'變成'some.log.20100911-084137';等等,其中後綴是日誌切換的日期/時間。這避免了一次重命名多個文件。名稱按時間順序自動排序。唯一的缺點是您對備份日誌的數量沒有限制。使用'find。 -mtime +183 -name'some.log。*'-exec rm {} \;'處理超過6個月的日誌;調整以適應您的週期時間。 – 2010-09-11 14:20:22

+0

你可以使用你的問題提供更新,而不是爲此使用答案。此外,如果你必須說「謝謝」,你可以在評論中做到這一點,而不是回答:http://blog.stackoverflow.com/2011/01/how-to-say-thanks-in-an-answer/。非常感激。 – Kev 2011-01-29 14:55:48

回答

5

如果你正在尋找翻身的日誌文件,並根據需要多麼複雜弄,我已經使用了以下段之前:

#!/usr/bin/bash 
# rollover.sh 
# Rolls over log files in the current directory. 
#  *.log.8 -> *.log.9 
#  *.log.7 -> *.log.8 
#  : : : 
#  *.log.1 -> *.log.2 
#  *.log -> *.log.1 

shft() { 
    # Change this '8' to one less than your desired maximum rollover file. 
    # Must be in reverse order for renames to work (n..1, not 1..n). 
    for suff in {8..1} ; do 
     if [[ -f "$1.${suff}" ]] ; then 
      ((nxt = suff + 1)) 
      echo Moving "$1.${suff}" to "$1.${nxt}" 
      mv -f "$1.${suff}" "$1.${nxt}" 
     fi 
    done 
    echo Moving "$1" to "$1.1" 
    mv -f "$1" "$1.1" 
} 

for fspec in *.log ; do 
    shft "${fspec}" 
    #date >"${fspec}" #DEBUG code 
done 

這將自動滾動日誌文件達到儘管您可以更改sufffor循環以允許更多。

隨着該DEBUG加入使新的文件被創建自動進行測試,下面的記錄表明它在行動:

pax> touch qq.log ; ./rollover.sh 
Moving "qq.log" to "qq.log.1" 

pax> touch "has spaces.log" ; ./rollover.sh 
Moving "has spaces.log" to "has spaces.log.1" 
Moving "qq.log.1" to "qq.log.2" 
Moving "qq.log" to "qq.log.1" 

pax> ll *log* 
-rw-r--r-- 1 pax None 30 2010-09-11 20:39 has spaces.log 
-rw-r--r-- 1 pax None 0 2010-09-11 20:39 has spaces.log.1 
-rw-r--r-- 1 pax None 30 2010-09-11 20:39 qq.log 
-rw-r--r-- 1 pax None 30 2010-09-11 20:38 qq.log.1 
-rw-r--r-- 1 pax None 0 2010-09-11 20:38 qq.log.2 

關於此腳本的好處是,它很容易配置,以處理大量的歷史(通過更改{8..1}位),使用空格處理名稱,並在日誌文件丟失的情況下相對強大地處理間隙。

+0

試圖創建我自己的日誌旋轉腳本,但這個看起來更好。它看起來幾乎是必要的:-))))* some.log.9 *(數字10)後,不是最舊的日誌文件被刪除,但第二個最舊的日誌文件被刪除。最古老的一直存在。我該如何解決這個問題? – 2010-09-11 13:01:00

+0

@Robertico,如果你存儲1到9,那麼8將覆蓋9,所以最舊的將自動被「刪除」。如果你已經有了10,只需要將'suff'循環更改爲最老的那個,然後減1。所以,如果你想保持1到50,循環應該是'{49..1}'。 – paxdiablo 2010-09-11 13:07:09

+0

@paxdiablo,在{8..1}中更改'suff爲';'在'{1..9}'中填入'suff';'沒有工作。它將* some.log *重命名爲* some.log.1 *之後* some.log.1 *變成* some.log.10 *和* some.log *變成* some.log.1 *。再次運行腳本。 * some.log.10 *保留,* some.log.1 *被刪除,* some.log *變成* some.log.1 *。有點令人困惑:-)) – 2010-09-11 13:28:05

2

要旋轉日誌,您應該使用logrotate

如果你不能依賴於可用的logrotate,這裏有一種方法在shell中執行。爲了簡單起見,我假設沒有其他任何東西(包括腳本的另一個實例)將嘗試在腳本運行時重命名日誌文件。

最簡單的方法是在實際將日誌N重命名爲N + 1之前遞歸重命名日誌N + 1。 shell可以執行所有必要的算術運算,在這裏您不需要sed。請注意,雖然在POSIX shell中可以使用遞歸函數,但除了位置參數(許多shell提供本地變量作爲擴展)之外,沒有局部變量。

#!/bin/sh 
## Move "$1.$2" to "$1.$(($2+1))", first rotating the target as well. 
rotate() { 
    if [ -e "$1.$(($2+1))" ]; then rotate "$1" $(($2+1)); fi 
    mv -- "$1.$2" "$1.$(($2+1))" 
} 

for x; do 
    ## Break each argument into FILE.NUMBER or just FILE. 
    suffix=${x##*.} 
    case $suffix in 
    *[!0-9]*) 
     if [ -e "$x.0" ]; then rotate "$x" 0; fi 
     mv -- "$x" "$x.0";; 
    *) rotate "${x%.*}" "$suffix";; 
    esac 
done 

關於你寫什麼,注意echo ${file}是壞的原因有兩個:最重要的是,如果${file}包含任何特殊字符,如空格,shell將其解釋;另外,有些炮彈,echo本身會解釋反斜槓,可能還有一個領先的-。所以你應該總是寫printf %s "$file"

+0

Thx。例如。 – 2010-09-11 14:12:13

+0

正是我所需要的。謝謝。 – joshsh 2017-06-25 16:34:18