我在 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
.
为了仅列出您想要保留的文件,您可以使用sort
和uniq
:
find . -name '???_*.txt' | sort --reverse | uniq --check-chars 3