使用 Bash 脚本删除目录中的所有文件(最新的四个文件除外)

使用 Bash 脚本删除目录中的所有文件(最新的四个文件除外)

我正在寻找一个 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

相关内容