在 cronjob 中复制文件并将其名称更改为唯一值

在 cronjob 中复制文件并将其名称更改为唯一值

我想创建一个 cronjob,复制 /var/log 中的每个文件,并将其放入 /etc/bak。我通过创建一个 sh 文件来做到这一点,该文件说

cp /var/log/*.* /etc/bak

我希望这些文件不会被覆盖,而是保持唯一。为此,我认为我应该在文件名中添加日期/时间。有没有办法在批量文件复制中实现这一点?

答案1

如何将每一批日志文件放在单独的目录中?你可以这样做:

dir=/etc/bak/`date "+%Y-%m-%d_%H.%M.%S"`
mkdir "$dir"
cp /var/log/*.* $dir

如果您想在所有复制的文件前面加上时间戳,您可以执行以下操作:

(cd /var/log && ls -1 *.*) | awk -v date=`date "+%Y-%m-%d_%H.%M.%S"` '{ print "cp /var/log/" $0 " /etc/bak/" date  $0}' | sh

答案2

要将文件复制到另一个目录并在过程中更改其名称,我建议使用 for 循环。

以下代码使用 提取文件的名称basename,然后创建该文件的副本,其/etc/bak名称与原始文件相同,并附加日期。

for file in /var/log/*; do 
    bn=$(basename $file)
    cp $file /etc/bak/${bn}.$(date +%F)
done

相关内容