我需要你的主题帮助。我的问题是我想根据文件名中的字段对目录中的文件进行排序,并删除旧文件。
例如; 我在目录中有两个文件,如下所示:
创建日期文件名
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脚本的解决方案吗?
提前致谢
答案 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/.
这样,您可以将每个密钥的所有最新文件(即唯一文件)移动到另一个目录;然后,可以删除那些剩下的文件。