【问题标题】:Bash - Version Numbers in Filenames. How to list latest versions only?Bash - 文件名中的版本号。如何仅列出最新版本?
【发布时间】:2020-06-11 12:26:14
【问题描述】:

我有一个版本化文件的目录。每个文件的版本都在其文件名中指示,例如“_v1”。

示例

ls显示的文件列表:

123_FileA_v1.txt
123_FileA_v2.txt
132_FileB_v1.txt

我想运行一个命令以仅查看 最新 版本:

123_FileA_v2.txt
132_FileB_v1.txt

我的第一次尝试是使用mtime 列出文件

ls -ltr

但在我的情况下,这并不能带来足够的结果。我真的很想从文件名中收集版本。

最好的方法是什么?

【问题讨论】:

  • 顺便说一句,在这个网站上,谁不表现出任何努力自己解决这些问题的问题是不受欢迎的。更不用说你会得到downvotes。
  • 投票重新开放。新用户提出了一个好的问题。 OP 不要求提供代码。 (我认为没有迫切需要自己尝试)。自投票结束后,问题已被编辑。
  • 感谢@jschnasse,很高兴看到“你尝试过什么”机器人的愚蠢军队的异议。我们真的有几十个人!欢迎use​​r12973426,这是一个有趣的谜题。
  • 谢谢大家,对不起,这是我第一次在这里发帖,我会注意它并在以后的问题中表现出更多的努力

标签: bash unix


【解决方案1】:

这样就可以了:

ls | awk -F '_' '!prefixes[$1]++'

希望对你有帮助!

编辑:

如果您想查看具体信息,您可以这样做:

ls | awk -F '_' '!prefixes[$1]++' | xargs ls -lh

只要您的文件名中没有空格,这将起作用。

编辑:

根据@PaulHodges 的要求,这是示例输出:_

$ ls -lh
total 0
drwxr-xr-x    5 Matias-Barrios  Matias-Barrios   160B Feb 27 11:40 .
drwxr-xr-x  106 Matias-Barrios  Matias-Barrios   3.3K Feb 27 11:39 ..
-rw-r--r--    1 Matias-Barrios  Matias-Barrios     0B Feb 27 11:40 132_FileB_v1.txt
-rw-r--r--    1 Matias-Barrios  Matias-Barrios     0B Feb 27 11:40 123_FileA_v2.txt
-rw-r--r--    1 Matias-Barrios  Matias-Barrios     0B Feb 27 11:40 123_FileA_v1.txt
$ ls | awk -F '_' '!prefixes[$1]++' 
.
..
132_FileB_v1.txt
123_FileA_v2.txt

【讨论】:

  • 这是做什么的?对我来说,除了ls 之外似乎没有做任何事情。
  • @PaulHodges 它对我有用。它对 OP 给定输入的文件名进行了去重
  • 如果有findfor file in *,为什么还要ls
  • @Quasímodo 我不知道;问 OP。
  • 非常感谢您提供快速而完美的解决方案 :)
【解决方案2】:

你可以这样做

( 
PATTERN="[0-9]{3}_[^_]*" 
for prefix in `find . | egrep -o "$PATTERN" | sort -u`; 
do 
   ls $prefix* | tail -1; 
done
)

它会打印出来

123_FileA_v2.txt
132_FileB_v1.txt

这里发生了什么?

  • 周围的大括号( 用于支持所提供代码的复制和粘贴。 read more
  • 变量PATTERN用于访问以相同前缀开头的所有文件。
  • for prefix in `find . | egrep -o "$PATTERN" | sort -u 生成文件前缀列表。
  • ls $prefix* 按字母数字顺序列出所有具有相同前缀的文件
  • | tail -1 仅显示前ls $prefix* 的最后一个条目

编辑

我决定使用find . 而不是ls *。有了这个,我希望绕过issues with ls *。如果我错了,请纠正我!

【讨论】:

  • 现在不用parsing ls
  • 感谢这个工作,但是当文件列表变得很大时,它似乎变得有点慢,可能是由于循环中的 ls
猜你喜欢
  • 2010-10-05
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-22
  • 2015-06-07
  • 1970-01-01
相关资源
最近更新 更多