【问题标题】:Bash - how to copy latest files by filename to another folder?Bash - 如何按文件名将最新文件复制到另一个文件夹?
【发布时间】:2021-04-08 09:31:12
【问题描述】:

假设我在文件夹 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


【解决方案1】:

这段代码可以工作:

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

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

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

不过,对于机器可读的文件名,我建议使用日-月-年或年-月-日格式。

【讨论】:

  • O_O 我从来不知道 sort 有一个 -t 字段分隔符选项,并且总是用 cut 来做杂技
  • 您应该避免使用for i in $(cmd) 语法并改用cmd|while read。原因如下:stackoverflow.com/a/19607361/2900196
  • @IdrissNeumann 谢谢。你是绝对正确的。我不会正确处理空格。我更新了我的答案。
【解决方案2】:

使用awk

ls -1 Test1/ | awk -v src_dir="Test1" -v target_dir="Test2" -F '(-|_)' '{p=$4""$2""$3; if(!($1 in b) || b[$1] < p){a[$1]=$0}} END {for (i in a) {system ("mv "src_dir"/"a[i]" "target_dir"/")}}'

【讨论】:

    猜你喜欢
    • 2017-03-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 2019-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多