重命名多个文件,对其进行 gzip 压缩并删除超过 10 天的文件

重命名多个文件,对其进行 gzip 压缩并删除超过 10 天的文件

我是Linux/Unix新手,正在一步步慢慢学习。不幸的是,在今天的工作面试中,我对一项要做的任务感到惊讶(我当然不知道)。我被要求准备一个 bash 脚本:

  • 更改.log 的名称。文件到 (name).(date).log.(原始名称的剩余部分) 并将它们 gzip 到 .gz 存档。

  • 删除超过 10 天的 (名称).(日期).log.(原始名称的剩余部分).gz 文件。

询问永远不会太晚,如果您能让我知道它应该是什么样子,我将不胜感激。

答案1

假设使用 GNU 工具,我会做类似的事情

find . -type f \( -name '*.[0-9][0-9][0-9][0-9]-[0-1][0-9]-[0-3][0-9].log.*.gz' \
       \( -mtime -10 -o -delete -o -true \) -o -name '*.log.*' ! -name '*.gz' \
       \( -mtime +9 \( -delete -o -true \) -o -printf '%TF/%p\0' \) \) |
  while IFS=/ read -rd '' date file; do
    basename=${file##*/}
    dirname=${file%/*}
    newfile=$dirname/${basename%.log.*}.$date.log.${basename##*.log.}
    mv "$file" "$newfile" && gzip "$newfile"
  done

答案2

#!/bin/bash

workdir="/tmp/myfilestomove"
#cd "$workdir"
[ ! -e "$workdir" ] && exit 

find -type f "$workdir" | grep -v '.gz' | while read file; do
     filedate="$(date -r "$file" +%d%m%Y)"
     basename="${file%.*}"
     extension="${file##*.}"
     echo mv "$file" "${basename}.${filedate}.${extension}" 
     echo gzip "${basename}.${filedate}.${extension}"
done


find -type f -mtime +10 "$workdir" | while read file; do
     echo rm "$file"
done

仅当您测试了脚本时才删除 echo,并在首次使用之前备份文件。

相关内容