更改文件名后缀(使用sed?)

Joh*_*Doe 4 shell filenames rename sed

我想从文件中更改文件名后缀(使用bash脚本),但有时会有一个句点和一些带有两个句点的文件.

现在我用这个:

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

其中'new_file'是新文件名,'file'是原始文件名,'$ {suf}'是文件的后缀,$ {num}是新号码.

因此some.log必须成为some.log.1,some.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
Run Code Online (Sandbox Code Playgroud)

现在每件事情都很好.对困惑感到抱歉.

pax*_*blo 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
Run Code Online (Sandbox Code Playgroud)

这将自动将日志文件翻转到版本9,尽管您可以更改suff for循环以允许更多.

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
Run Code Online (Sandbox Code Playgroud)

这个脚本的好处在于,它可以轻松配置以处理大量历史记录(通过更改{8..1}位),使用空格处理名称,并在日志文件丢失时相对稳健地处理间隙.