我正在寻找一个 Bash 脚本,它将进入目录列表并删除除最近创建的四个文件之外的所有文件。
我怎样才能做到这一点?
答案1
ls -t | sed '1,4d' | xargs echo rm
echo
当您对想要的结果感到满意时,请删除。
如果文件名中有空格,则需要做更多工作。
答案2
您想保留每个目录中最近的四个文件,还是保留任意目录中最近的四个文件?
要解决第一个问题,您可以使用 find 列出每个目录,然后在每个目录中删除除最近的四个文件之外的所有文件。这并不难。
解决第二个问题需要多花点心思,但实际上写起来更容易。
基本上,递归查找每个文件。调用“stat”命令返回文件的修改时间和名称。按数字降序排列,并跳过前四个文件(即最新的文件)。
然后删除前导时间戳,并删除生成的文件名列表。
类似于(未经测试):
#!/bin/bash
find "$@" -type f -print0 \
| xargs -0 stat -c$'%Y\t%n' \
| sort -rn \
| awk -F$'\t' 'NR > 4 {print $2}' \
| while read f; do
echo rm -v "${f}"
done
这应该可以工作,不过您需要删除 while 循环中的“echo”才能使其有效。请先仔细测试!
答案3
我意识到这不是你要求的,但对于这种备份,我更喜欢在创建新文件之前轮换日志文件。这更明确一些,而且编码也更简单,如下所示:
#!/bin/bash
#Archive old backups
move () {
if [ -e $1 ]
then
echo "Archiving old backups: $1 to $2"
mv -f $1 $2 || echo "FAILED"
fi
}
#Bump each backup +1
rm -rf backup.4
move backup.3.tgz backup.4.tgz
move backup.2.tgz backup.3.tgz
move backup.1.tgz backup.2.tgz
move backup.tgz backup.1.tgz
#Now create today's backup
...
答案4
最简单的方法:
for d in dir1 dir2 dir3; do
rm -vf `ls -1t $d | head -n-4`
done