根据文件名中的字段对类似文件进行排序,并删除旧文件

时间:2018-01-17 08:01:42

标签: bash shell unix solaris

我需要你的主题帮助。我的问题是我想根据文件名中的字段对目录中的文件进行排序,并删除旧文件。

例如; 我在目录中有两个文件,如下所示:

创建日期文件名

Jan 10 15:56 FileFormat_1-IKRF2YZ_1-IKRF2YX_20180109.txt

Jan 10 16:40 FileFormat_1-IKRF2YZ_1-IKRF2YX_20180110.txt

我需要按"_"字符拆分文件名,并按两个ID字段("1-IKRF2YZ_1-IKRF2YX")对文件进行排序,然后删除/移动较旧的字段。

你能帮我找一个shell脚本的解决方案吗?

提前致谢

1 个答案:

答案 0 :(得分:0)

获取按键排序的文件列表(文件名)和文件修改时间(%C@以获取修改时间,%f获取文件名;将其更改为您需要的文件:< / p>

$> find directory -printf '%C@ %f\n' | \
        sed -n -r '/_.*_/{s:^([^_]*)_(.*)_(.*)$:\2 \1_\2_\3:;p}' | \
        sort

1-IKRF2YZ_1-IKRF2YX 1516178476.1838399230 FileFormat_1-IKRF2YZ_1-IKRF2YX_20180110.txt
1-IKRF2YZ_1-IKRF2YX 1516178479.7838400320 FileFormat_1-IKRF2YZ_1-IKRF2YX_20180109.txt
1-IKRF2YZ_1-IKRF2YX 1516178501.4338406770 FileFormat_1-IKRF2YZ_1-IKRF2YX_20180111.txt

要按该列表中的键获取UNIQUE文件列表(注意:&#34;唯一&#34; =只取第一个,所以我们需要颠倒它的顺序):

$> find directory -printf '%C@ %f\n' | \
        sed -n -r '/_.*_/{s:^([^_]*)_(.*)_(.*)$:\2 \1_\2_\3:;p}' | \
        sort -r | \
        sort -k1,1 -u 

1-IKRF2YZ_1-IKRF2YX 1516178501.4338406770 FileFormat_1-IKRF2YZ_1-IKRF2YX_20180111.txt

现在,您可以将这些选定的文件移动到另一个目录:

$> find directory -printf '%C@ %f\n' | \
     sed -n -r '/_.*_/{s:^([^_]*)_(.*)_(.*)$:\2 \1_\2_\3:;p}' | \
     sort -r | \
     sort -k1,1 -u | \
     sed -r 's:^([^ ]+) ([^ ]+) (.*+)$:mv \"\3\" to-another-dir\/.:'

mv "FileFormat_1-IKRF2YZ_1-IKRF2YX_20180111.txt" to-another-dir/.

这样,您可以将每个密钥的所有最新文件(即唯一文件)移动到另一个目录;然后,可以删除那些剩下的文件。