首页 > 解决方案 > Bash - 如何按文件名将最新文件复制到另一个文件夹?

问题描述

假设我在文件夹 Test1 中有这些文件

AAAA-12_21_2020.txt
AAAA-12_20_2020.txt
AAAA-12_19_2020.txt
BBB-12_21_2020.txt
BBB-12_20_2020.txt
BBB-12_19_2020.txt

我想要下面的最新文件到文件夹 Test2

AAAA-12_21_2020.txt
BBB-12_21_2020.txt

标签: bash

解决方案


此代码将起作用:

ls $1 -U | sort | cut -f 1 -d "-" | uniq | while read -r prefix; do
    ls $1/$prefix-* | sort -t '_' -k3,3V -k1,1V -k2,2V | head -n 1
done

我们首先遍历指定为第一个参数的目录中的每个前缀,我们通过对文件列表进行排序并删除重复项来获得它,然后再提取之前的所有内容-_然后我们使用 sort 选项按符号分隔的三个字段对这些文件名进行-k排序(主要是在第三个字段中按年,然后在第二个字段中按月,最后是几天)。我们使用版本排序能够忽略周围的文本并正确解释数字(与字典排序相反)。

我不确定这是否是最好的方法,因为我只使用了基本的 bash 函数。由于日期格式和您必须区分前缀的事实,您必须完全解析字符串,这是更适合 AWK 或 Perl 的工作。

尽管如此,我还是建议对机器可读的文件名使用日-月-年或年-月-日格式。


推荐阅读