0

我有多个名称格式如下所述的文件:

  1. ABC_Report_v-20120801_1741.csv
  2. ABC_Report_v-20120801_1741.csv
  3. ABC_Report_v-20120907_1254.csv
  4. XYZ_Dashboard_v-20120802_1804.csv
  5. XYZ_Dashboard_v-20120806_2031.csv
  6. XYZ_Dashboard_v-20120802_1946.csv

我想删除除了最新的文件之外的所有文件,ABC_Report_v-20120907_1254.csv并且应该删除字符XYZ_Dashboard_v-20120802_1946.csv 之前具有相同名称的多个文件,只保留最新的文件。_v

4

1 回答 1

1

请注意,这不能防止重复行。您应该uniq在像这样处理之前列出您的文件列表,或者记住在尝试删除已经消失的文件时忽略错误。

$ awk -F- 'NR>1 && $1==base {print last} {base=$1;last=$0}' files.txt
ABC_Report_v-20120801_1741.csv
ABC_Report_v-20120801_1741.csv
XYZ_Dashboard_v-20120802_1804.csv
XYZ_Dashboard_v-20120806_2031.csv

从这里开始,一旦您确认匹配的文件是要保留的文件,您就可以通过xargs -n 1 rm.

请注意,此解决方案要求您的文件列表按日期预先排序。这应该是ls大多数系统的默认行为。所以:

$ ls | awk '...' | xargs -n 1 rm -v

在您对自己所做的事情不是 100% 有信心的情况下进行程序化删除之前,请务必备份您的数据。哎呀,无论如何都要备份您的数据。永远不知道下一个太阳黑点什么时候会到来。

于 2012-09-13T13:00:19.620 回答