Linux shell脚本用于在文件夹中获取<特定名称>的<最新文件>

3

我正在改进我的Linux脚本,我有一个包含许多不同日期文件的文件夹,我想获取以特定名称开头的最新文件。

例如:
我在一个文件夹中有以下文件列表,我需要名为Subnetwork_RAN的最新文件:

Subnetwork_PCC_11Dec2022UTC0500
Subnetwork_RAN_12Dec2022UTC0500
Subnetwork_RAN_13Dec2022UTC0500
Subnetwork_PCC_13Dec2022UTC0500

输出将是文件名Subnetwork_RAN_13Dec2022UTC0500

我尝试编写一个Linux shell脚本来获取特定名称的最新文件。


1
有没有可能将日期格式更改为 ISO 8601?这将使这成为一个微不足道的任务。 - Biffen
嗨Briffen,实际上我想从特定文件夹中获取特定名称的最新文件,例如以“abc”开头的最新文件名。 - anupcoll kumar
1
我理解了。但这并没有回答我的问题。 - Biffen
我无法更改文件名。 - anupcoll kumar
1
你的意思是通过“latest”指的是带有其名称中最高时间戳的文件,而不是指文件的修改时间? - user1934428
2个回答

1
这个问题有一个相当简单的awk解决方案:
ls -tl | awk ' $9 ~ /Subnetwork_RAN/ {print $9; exit;}'

ls -tl 命令以时间排序(最新的在前面)的方式,输出当前目录的长格式列表。

这个输出通过管道传输给 awk 命令,它会逐行查找包含所需字符串的文件名。首次找到后,它会打印文件名并退出。

请注意,这假设(就像您的示例中)文件名不含空格。如果有空格,需要修改打印语句,将打印行的子字符串$0从您的字符串开始一直到行末。

如果您的字符串可能在更近期的文件名中重复出现,但不是以开头的形式,则可以修改正则表达式条件,只选择以您的字符串开头的文件名 $9~/^Subnetwork_RAN/


你正在做出一个强烈的假设,即按时间排序和按文件名中的日期排序会得到相同的结果。OP 应该意识到这一点。 - mik1904
@mik1904 或许你对 -t 的工作方式有了错误的假设。这个过程已经测试并且有效,通过年份、日期、时间顺序排序。最新的排在最前面。 - Dave Pritlove
据我所知,-t 使用文件修改时间进行排序。这是真的吗? - mik1904

0

假设您有一个名为test.txt的文件,其中包含您所示的文件名。然后在Bash中,您可以执行以下操作:

awk 'BEGIN {FS="_"} $0 ~/Subnetwork_RAN/ {printf "%s ",$0; system("date +%s -d " $3)}' asd | sort -rn -k 2 | head -1 | cut -d " " -f 1

输出:

Subnetwork_RAN_13Dec2022UTC0500

一些解释:

  • $0 ~ /Subnetwork_RAN/ 匹配包含子字符串“Subnetwork_RAN”的所有行
  • bash 命令 date 可以识别像 13Dec2022UTC0500 这样的日期格式并将其转换为时间戳 (date +%s)
  • sort 按第二个字段(awk system 调用的时间戳输出)以数字逆序排序
  • head 给出第一行,即最近的一行
  • cut 根据字段分隔符“ ”取第一个字段。第一个字段是完整的文件名 (awk 中的 printf 调用)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接