案例:我在 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
。如果有变化,前一行将保留前一个日期的最旧条目。