我在/root/test/access.log.1
to999
和/root/test/error.log.1
to中有文件999
。
我想重命名access.log.1
为access.log.2
并移动到/var/log/archives/
,同样的方式error.log.1
为error.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