根据文件名中给出的序列号选择最新的文件

根据文件名中给出的序列号选择最新的文件

我的目录中只有几个文件,我需要选择最旧的一个进行处理。

对于 Exp:我在 /tmp 目录中有以下文件:

Sample_0000237826-001_xyz.dat
Sample_0000437564-001_xyz.dat
Sample_0000237826-002_xyz.dat
Sample_0000137294-003_xyz.dat

所以我的脚本应该首先根据文件名中的第一组 10 位数字对文件进行排序嗯嗯嗯嗯,对于第一组 10 位数字,如果它获得多个条目,那么它应该对下一组 3 位数字进行排序,即恩恩,并且它应该选择最旧的一个。

一旦我选择了该文件进行处理,我就会将其从目录中删除。所以下次运行时它不会出现。

因此,对于第一次运行,我应该选择文件:Sample_0000137294-003_xyz.dat

对于第二次运行,我应该选择:Sample_0000237826-001_xyz.dat

对于第三次运行,我应该选择:Sample_0000237826-002_xyz.dat

等等。

大家忘记添加一件事,这些文件将从远程服务器一一复制到我的本地服务器,如上所述,因此为了复制,我使用“rsync”。因此,请告诉我下面提供的解决方案是否也适用于 rsync 命令。

答案1

zsh

extract_numbers() REPLY=${(SM)REPLY##<->-<->}
for file (*<->-<->*.dat(no+extract_numbers)) {
  do-what-you-will-with $file
}

我们定义一个排序函数 ( extract_numbers),它返回所匹配S的文件名的 ubstring (匹配任何正十进制数)。M<->-<-><->

我们使用该函数对全局进行n数字o排序*<->.<->*.dat

答案2

假设

  • 所有文件不以 Sample 开头
  • 数字字段由_
  • 您无法转发文件时间

我会用

sort -t_ -k2n

示例中给出的四个文件的产量

Sample_0000137294-003_xyz.dat
Sample_0000237826-001_xyz.dat
Sample_0000237826-002_xyz.dat
Sample_0000437564-001_xyz.dat

答案3

#!/bin/bash

ls /tmp/*dat > filelist

while read fn
do 
    #do something with /tmp/$fn
done < filelist

答案4

此命令将仅给出按数字字段排序的一个文件的文件名,假设模式为Sample_nnnnnnnnnn-ppp_xyz.dat

ls Sample_$(ls -l *.dat | awk -F ' |_' {'print $10'} |sort -n| head -1)*.dat

相关内容