【问题标题】:Linux print file names based on patternLinux 基于模式打印文件名
【发布时间】:2021-02-13 05:12:05
【问题描述】:

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

文件:

    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

任何帮助将不胜感激。

【问题讨论】:

  • 你说 "因为 Test-11121 (Initial 10 char ) 在最初的两个文件中是一样的" 但是一个是Test-11121,另一个是Test-01121。您的意思是说它们是相同的,因为除了前 10 个字符之外的所有其他字符都是相同的,还是您的示例不好?
  • @JNevill 对不起,我的错。已更正。感谢您强调
  • 不确定为什么会有反对票?任何改善我的问题的建议
  • 请注意:Why not parse ls?
  • 您实际上并不需要在这里“解析”输出 - 使用基于时间的排序,您所需要的只是文件名。这里的“解析”是一个红鲱鱼。

标签: linux unix awk sed grep


【解决方案1】:

这对你有用吗?

$ 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 个字符匹配的最后一个文件将在数组中。最后,我们只是遍历数组并输出所有最近的文件名。

【讨论】:

    猜你喜欢
    • 2012-06-18
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    相关资源
    最近更新 更多