如何在zsh脚本中查找一组文件中的最新文件并删除旧文件?

如何在zsh脚本中查找一组文件中的最新文件并删除旧文件?

我在 zsh 脚本编写中遇到问题。我的目录中有一组文件,例如:

001_20160223.txt  /delete
001_20161102.txt  /delete
001_20161209.txt  /keep
005_20160502.txt  /delete 
005_20161105.txt  /delete
005_20161206.txt  /keep
009_20160502.txt  /delete
009_20161105.txt  /delete
009_20161205.txt  /keep

现在,我们必须对具有相同起始编号的文件进行排序,例如。 001 然后我们根据文件名中写入的日期找到最新的文件并删除旧文件。我们也必须对其他文件执行相同的方法。所以目录中的最终输出如下:

001_20161209.txt  /keep
005_20161206.txt  /keep
009_20161205.txt  /keep

这是我到目前为止所尝试过的:

files=($(find . -name "???_*.txt")) | if ((#files > 1)); then rm -- ${files[1,-2]}; fi

但它正在删除除最后一个文件之外的所有文件。我想创建一组具有相同起始名称的单独文件,然后将其删除。

答案1

您可以反转文件的顺序 ( sort --reverse),这样最新的文件将始终是具有相同前缀的文件块中的第一个文件。然后,您可以跟踪当前块(使用$current_prefix)并保留每个块中的第一个文件(continue)以及rm该块中的所有其他文件:

current_prefix=
find . -name '???_*.txt' | sort --reverse | while read line; do
  if [[ ${line[1,5]} != $current_prefix ]]; then
    # we are at the beginning of a new block
    current_prefix=${line[1,5]}
    continue # actually not needed b/c there is nothing outside the if block.
  else
    rm -- $line
  fi
done

注意:为了首先测试这一点,您可以rm在所有命令前面加上echo.

为了仅列出您想要保留的文件,您可以使用sortuniq

find . -name '???_*.txt' | sort --reverse | uniq --check-chars 3

相关内容