用于获取文件夹中〈特定名称>的〈最新文件>的linux shell脚本

abithluo  于 2022-12-18  发布在  Linux
关注(0)|答案(2)|浏览(342)

我正在增强我的linux脚本,我有一个文件夹,里面有很多不同日期的文件,我想获取一个以特定名称开头的最新文件。
例如。
我有下面的文件列表中的文件夹,我需要名称Subnetwork_RAN的文件夹中的最新文件:

Subnetwork_PCC_11Dec2022UTC0500
Subnetwork_RAN_12Dec2022UTC0500
Subnetwork_RAN_13Dec2022UTC0500
Subnetwork_PCC_13Dec2022UTC0500

输出文件名为子网_RAN_13Dec2022UTC0500
我试图建立一个Linux shell 脚本,以获得特定名称的最新文件。

eufgjt7s

eufgjt7s1#

这个问题有一个相当简单的awk解决方案:

ls -tl | awk ' $9 ~ /Subnetwork_RAN/ {print $9; exit;}'

ls -tl输出当前目录的长列表,按时间排序(最新的排在前面)。
这个输出通过管道传输到awkawk逐行查找包含所需字符串的文件名,第一次找到时,打印文件名并退出。
注意,这是假设文件名中不包含白色(如示例中所示),如果包含空格,则需要修改print语句,将以字符串开头的$0行的子字符串打印到该行的末尾。
如果您的字符串可能在较新的文件名中重复,但不在开头,则可以修改regex条件,以便仅选择字符串开头为$9~/^Subnetwork_RAN/的文件名

guykilcj

guykilcj2#

假设你有一个名为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

相关问题