用增量编号重命名文件

用增量编号重命名文件

我在/root/test/access.log.1to999/root/test/error.log.1to中有文件999

我想重命名access.log.1access.log.2并移动到/var/log/archives/,同样的方式error.log.1error.log.2

我尝试了类似下面的东西

#!/bin/bash
NEWFILE=`ls -ltr |grep error |tail -2 | head -1 |awk '{print $9}'`
for i in `ls -ltr |grep error |tail -1`;
do
    mv "$i" /var/log/archives/"$NEWFILE"
done

答案1

简单的bash脚本:

for file in {access,error}.log.{999..1}; do
    echo "$file" "/path/to/dest/${file//[0-9]}$((${file//[a-z.]}+1))";
done
  • ${file//[0-9]},这会删除数字并仅保留将产生error.log.access.log.部分的字母。
  • ${file//[a-z.]},这仅删除字母和点(我写是a-z.因为你的文件名模式),这将导致数字部分;和
  • $((${file//[a-z.]}+1))会将上面生成的数字部分加一。

这将重命名文件如下并移动到/path/to/dest/

access.log.999 --> /path/to/dest/access.log.1000
access.log.998 --> /path/to/dest/access.log.999
...
error.log.999 --> /path/to/dest/error.log.1000
error.log.998 --> /path/to/dest/error.log.999
...

echo请注意,将空运行替换mv为对文件进行重命名。

答案2

我们可以按照以下方式运行一些东西

perl -E 'for (reverse 1..999){
            rename( "access.log.$_" , "access.log.".($_+1))}'

答案3

#! /usr/bin/env bash

# exit on error
set -e

# increase the numbers of the old archives (mv -i avoids accidental overwrite)
for ((i=999; i >= 2; i--)); do
    for name in access error; do
        if [[ -e /var/log/archives/$name.log.$i ]]; then
            mv -i "/var/log/archives/$name.log.$i" "/var/log/archives/$name.log.$((i+1))"
        fi
    done
done

# move current files to archives
for name in access error; do
    mv -i "/root/test/$name.log.1" "/var/log/archives/$name.log.2"
done

相关内容