複数のファイルの名前を変更し、gzipで圧縮して10日以上経過したファイルを削除します。

複数のファイルの名前を変更し、gzipで圧縮して10日以上経過したファイルを削除します。

私はLinux/Unixに初めて触れ、段階的に学んでいます。残念ながら、今日の面接で(確かに知らなかった)やるべきことがあって驚きました。 Bashスクリプトの準備を求められました。

  • .logの名前を変更します。ファイルを(名前)。(日付).log。(元の名前の残りの部分)に保存し、.gzアーカイブとしてgzipします。

  • 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を削除し、初めて使用する前にファイルをバックアップしてください。

関連情報