我有一个包含 1-4 百万个文件的文件夹。每个文件都具有以下格式:
trial_nubyb_$i_out.html
Run Code Online (Sandbox Code Playgroud)
其中 $i 是从 1 开始的数字
如何获取文件夹中最大的 5 个编号文件?我只需要 5 个最大的数字,甚至不需要文件名,即我只需要最大的 5 $i,不需要 Trial_nubyb_$i_out.html,但整个文件名都很好。
如果我“ls -la | tail -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
Run Code Online (Sandbox Code Playgroud)
我在 Ubuntu 上使用 bash。
一个简单的 bash 解决方案,但如果它太完整,PHP 也受欢迎。
这个答案适用于
lsUbuntu中使用的GNU 核心实用程序。它实际上并不包含在 bash 本身中,如果您使用的是 macOS,您会看到不同的输出。
您可以添加-v选项来获取“文本中(版本)数字的自然排序”:
ls -lav | tail -5
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
(请注意,版本排序实际上具有更复杂的逻辑,但这不会影响您当前的用例。)