増分番号でファイル名を変更する

増分番号でファイル名を変更する

/root/test/access.log.1to999とtoに/root/test/error.log.1ファイルがあります999

と同じ方法でaccess.log.1名前を変更してにaccess.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))上記で作成した数字に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
...

echomvファイルの名前を変更すると、練習の実行が置き換えられます。

答え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

関連情報