如何保留每天的最后一个文件并删除 Linux 中剩余的日期

如何保留每天的最后一个文件并删除 Linux 中剩余的日期

案例:我在 Linux 中有一个文件夹,其中每天都会创建/生成大量文件。现在我想保留最后一个文件并每天删除剩余的文件

例子

abc_2022_08_08_04:47:39.done       08-Aug-2022 04:31           119864435  
abc_2022_08_08_07:47:39.done       08-Aug-2022 07:30           119875333  
abc_2022_08_09_04:47:37.done       09-Aug-2022 04:30           119995734  
abc_2022_08_09_05:47:39.done       09-Aug-2022 05:30           120002986  
abc_2022_08_09_06:47:38.done       09-Aug-2022 06:30           120011628  
abc_2022_08_09_07:47:39.done       09-Aug-2022 07:30           120037486  
abc_2022_08_10_04:47:38.done       10-Aug-2022 04:30           120198109  
abc_2022_08_10_05:47:38.done       10-Aug-2022 05:31           120222712  
abc_2022_08_10_06:47:41.done       10-Aug-2022 06:30           120249157 

我们需要输出:

abc_2022_08_08_07:47:39.done       08-Aug-2022 07:30           119875333  
abc_2022_08_09_07:47:39.done       09-Aug-2022 07:30           120037486  
abc_2022_08_10_06:47:41.done       10-Aug-2022 06:30           120249157

我正在编写以下脚本,但是无法理解其逻辑或循环。看起来需要一些专家的建议或帮助。

谢谢

答案1

使用名为 this 的文件中的文件列表listing似乎可以完成您所要求的操作:

$ sort -k2,3 listing
abc_2022_08_08_04:47:39.done       08-Aug-2022 04:31           119864435
abc_2022_08_08_07:47:39.done       08-Aug-2022 07:30           119875333
abc_2022_08_09_04:47:37.done       09-Aug-2022 04:30           119995734
abc_2022_08_09_05:47:39.done       09-Aug-2022 05:30           120002986
abc_2022_08_09_06:47:38.done       09-Aug-2022 06:30           120011628
abc_2022_08_09_07:47:39.done       09-Aug-2022 07:30           120037486
abc_2022_08_10_04:47:38.done       10-Aug-2022 04:30           120198109
abc_2022_08_10_05:47:38.done       10-Aug-2022 05:31           120222712
abc_2022_08_10_06:47:41.done       10-Aug-2022 06:30           120249157

$ awk  -v start="$(awk '{print $2}' <(sort -k2,3 listing|head -n 1) )"  '{if( $2!=start ){print prev;start=$2}else{prev=$0};}END{print prev}' <(sort -k2,3 listing)
abc_2022_08_08_07:47:39.done       08-Aug-2022 07:30           119875333
abc_2022_08_09_07:47:39.done       09-Aug-2022 07:30           120037486
abc_2022_08_10_06:47:41.done       10-Aug-2022 06:30           120249157

它有什么作用?

"$(awk '{print $2}' <(sort -k2,3 listing|head -n 1) )"对文件进行排序,打印日期字段

awk -v begin="$(awk '{print $2}' <(sort -k2,3 listing|head -n 1) )"将日期字段(因为我们对其进行了排序,所以是最旧的)存储在名为的变量中start

然后我们迭代相同的排序输出,比较变量中每一行的日期字段start。如果有变化,前一行将保留前一个日期的最旧条目。

相关内容