首页 > 解决方案 > Linux 基于模式打印文件名

问题描述

我有一个要求,我需要列出具有独特模式的目录中的文件,并在重复的情况下选择最近更新的文件以避免重复记录。

文件:

    File Name                                               Update Time
    Test-11121202025-20201006-111506-1601997306.txt         Oct 25, 2020
    Test-11121202025-20201006-111506-1801997306.txt         Oct 30, 2020
    Test-77722202025-20201006-111506-1601997306.txt         Oct 25, 2020

在这种情况下所需的输出:

Test-01121202025-20201006-111506-1801997306.txt
Test-77722202025-20201006-111506-1601997306.txt

说明:第一个和第二个文件与我的用例相同,因为 Test-11121 (Initial 10 char ) 在最初的两个文件中是相同的,但是第二个是最近更新的,所以我将丢弃第一个。除此之外,因为第三个文件是唯一的,因为只有一个带有模式的条目(Test-77722)所以我也会认为这是在输出中。

我尝试了以下命令,但这没有帮助。我想我可以使用 shell 脚本来实现,但我想避免为这个小用例这样做

 ls -lt| awk 'BEGIN{FS="-"}{ print $2 }' | sort | uniq

任何帮助将非常感激。

标签: linuxunixawksedgrep

解决方案


这对你有用吗?

$ ls -l
total 0
-rw-rw-r-- 1 tink tink 0 2020-09-12 16:48 Test-11121202025-20201006-111506-1601997306.txt
-rw-rw-r-- 1 tink tink 0 2020-10-31 07:04 Test-11121202025-20201006-111506-1801997306.txt
-rw-rw-r-- 1 tink tink 0 2020-10-31 07:03 Test-77722202025-20201006-111506-1601997306.txt

awk进行救援:

$ ls -tr | awk '{a[substr($1,1,10)]=$0} END{for(i in a){print a[i]}}'
Test-77722202025-20201006-111506-1601997306.txt
Test-11121202025-20201006-111506-1801997306.txt

编辑:这个工作的方式是我们创建一个数组,由每个文件名的前 10 个字符索引,包含整个文件名。由于文件从最旧到最新排序,因此只有与前 10 个字符匹配的最后一个文件将在数组中。最后,我们只是遍历数组并输出所有最新的文件名。


推荐阅读