查找具有最大编号的文件名

时间:2017-11-12 11:55:33

标签: bash

我有一个包含1-4百万个文件的文件夹。每个文件都具有以下格式:

trial_nubyb_$i_out.html

其中$ i是从1开始的数字

如何获取文件夹中最大的5个编号文件?我只需要5个最大的数字,甚至不需要文件名,即我只需要最大的5 $ i而不需要trial_nubyb_ $ i_out.html,但整个文件名都没问题。

如果我" ls -la |尾巴-5"这不起作用,因为系统按字母顺序排列文件名""而不是从最小到最大的数字,所以最后5个实际上是:

trial_nubyb_999998_out.html
trial_nubyb_999999_out.html
trial_nubyb_99999_out.html
trial_nubyb_9999_out.html
trial_nubyb_999_out.html

我在Ubuntu上使用bash。

一个简单的bash解决方案,但如果它太完整了,PHP也欢迎。

2 个答案:

答案 0 :(得分:2)

  

此答案适用于Ubuntu中使用的GNU core utilities中的ls。它实际上并没有被包含在bash中,你会例如如果您使用的是macOS,请查看不同的输出。

您可以添加-v选项,以便在文字" 中获得"自然类型的(版本)数字:

ls -lav | tail -5
然后

ls将排序" trial_nubyb_10_out.html" 之后" trial_nubyb_9_out.html":

bash-4.4$ ls -la
total 8
drwxrwxrwx 1 cg cg 4096 Nov 12 12:16 .
drwxrwxrwx 1 cg cg 4096 Sep 9 10:53 ..
bash-4.4$ touch trial_nubyb_{1,9,10,99,219}_out.html
bash-4.4$ ls -la
total 8
drwxrwxrwx 1 cg cg 4096 Nov 12 12:17 .
drwxrwxrwx 1 cg cg 4096 Sep 9 10:53 ..
-rw-r--r-- 1 23941 23941 0 Nov 12 12:17 trial_nubyb_10_out.html
-rw-r--r-- 1 23941 23941 0 Nov 12 12:17 trial_nubyb_1_out.html
-rw-r--r-- 1 23941 23941 0 Nov 12 12:17 trial_nubyb_219_out.html
-rw-r--r-- 1 23941 23941 0 Nov 12 12:17 trial_nubyb_99_out.html
-rw-r--r-- 1 23941 23941 0 Nov 12 12:17 trial_nubyb_9_out.html
bash-4.4$ ls -lav
total 8
drwxrwxrwx 1 cg cg 4096 Nov 12 12:17 .
drwxrwxrwx 1 cg cg 4096 Sep 9 10:53 ..
-rw-r--r-- 1 23941 23941 0 Nov 12 12:17 trial_nubyb_1_out.html
-rw-r--r-- 1 23941 23941 0 Nov 12 12:17 trial_nubyb_9_out.html
-rw-r--r-- 1 23941 23941 0 Nov 12 12:17 trial_nubyb_10_out.html
-rw-r--r-- 1 23941 23941 0 Nov 12 12:17 trial_nubyb_99_out.html
-rw-r--r-- 1 23941 23941 0 Nov 12 12:17 trial_nubyb_219_out.html  

(请注意版本排序实际上有a bit more complex logic,但这不会影响您当前的用例。)

答案 1 :(得分:1)

Bash不能轻易做到你想做的事。虽然可以在bash中编写排序函数,但它不包含任何一个,所以最好的办法是使用其他工具进行排序。

虽然Linux coreutils版本的ls提供了-v选项,可以执行您想要的操作,但它不可移植且无法在macOS,FreeBSD,Solaris等中运行。便携式选项可能如下:

ls -f | cut -d_ -f3 | sort -n | tail -5

-f的{​​{1}}选项告诉它不要对其输出进行排序。如果目录中有四百万个文件,并且您要对输出进行排序,那么您可能需要这样做。

ls是分割字符串的简单方法。我们设置了分隔符和要输出的字段列表。

cut按数字排序。这与Linux" natural / version"完全相同。从sort -n排序,但它可能表现更好。 YMMV。

如果要对文件名进行排序而不将其中的数字分开,ls -v命令就可以对其进行排序。 sort并查找man sort-t个选项。这些选项也是便携式的。 :)

-k

(这假设您在文件名之前没有任何迷路下划线。)