如何列出文件 - 按文件名和修改日期排序?

Gab*_*udi 2 ls bash sort

我有一些文件名以 00, 01, ... 开头,但可以有多个文件名具有相同的编号,即 00_filename1, 00_filename2。我想按名称排序列出它们,但是如果有更多具有相同起始编号的文件,我希望它们也按修改日期(按降序)排序。

所以而不是这个:

Oct 31 19:05 00_trash
Oct 31 19:14 00_trash_00
Oct 31 18:57 01_creating_dirs.py
Oct 31 19:05 01_trash
Oct 31 16:20 02_creating_csv.py
Oct 31 19:22 02_renaming_files.sh
Oct 31 16:20 03_creating_db.py
Oct 31 19:06 03_trash
Oct 31 16:21 04_importing_csv_to_db.py
Oct 31 16:20 05_some_xl.py
Oct 31 16:22 06_regex.py
Run Code Online (Sandbox Code Playgroud)

然后我想这样排序:

Oct 31 19:14 00_trash_00
Oct 31 19:05 00_trash
Oct 31 19:05 01_trash
Oct 31 18:57 01_creating_dirs.py
Oct 31 19:22 02_renaming_files.sh
Oct 31 16:20 02_creating_csv.py
Oct 31 19:06 03_trash
Oct 31 16:20 03_creating_db.py
Oct 31 16:21 04_importing_csv_to_db.py
Oct 31 16:20 05_some_xl.py
Oct 31 16:22 06_regex.py
Run Code Online (Sandbox Code Playgroud)

我曾尝试将ls(使用参数-t-r)与sort(使用参数-kn,m- 其中n,m指定列的范围 - 和-r)结合起来,但是经过数小时的搜索和尝试,我没有成功。

Qua*_*odo 5

使用 GNU 实用程序,

ls -1t | sort -nst '_' -k 1,1
Run Code Online (Sandbox Code Playgroud)
  • ls -1t 按修改时间排序,每行输出一个文件。

  • sort

    • -n: 做一个数字排序,
    • -t '_': 使用下划线作为字段分隔符,
    • -k 1,1: 对第一个字段进行排序(即第一个下划线前的两位数字),
    • -s: 做一个稳定的排序,即不要使用以下字段进行排序,以防两行具有相同的第一个字段。

如果您更喜欢长列表格式输出,

ls -lt | sort -nsk 9.2
Run Code Online (Sandbox Code Playgroud)

9.2主要手段:只有排序的前两个第九字段的字符。

我假设这仅用于可视化,因为解析ls不应该是任何严肃脚本的一部分。