我是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,并在首次使用之前备份文件。