使用 LS 显示修改日期和特定文件数量

使用 LS 显示修改日期和特定文件数量

我正在使用ls -t | head -8它来显示目录中最后修改的 8 个文件,但这只会打印文件名。

有没有办法改变上述命令,以便它也显示文件名的修改日期?

答案1

你需要使用stat获取文件元数据:

stat -c $'%y\t%n' * | sort -n | head -8

答案2

stat是一种简单的方法,但它不能以 这样的格式打印时间戳ls -l。如果您想要对格式进行更细粒度的控制,请改用find选项-printf,例如(几乎)ls -l类似的格式:

find -maxdepth 1 -type f -printf "%T+#%Tb %Td %TH:%TM\t%p\n" | sort -rn | cut -d# -f2- | head -8

需要%T+对输出进行正确排序,然后由cutaftwerwards 删除。阅读man find了解有关find的强大-printf选项的更多信息。

示例运行

$ ls -l
total 0
-rw-rw-r-- 1 dessert dessert 0 May 30 20:22 last week
-rw-rw-r-- 1 dessert dessert 0 Jun  6 17:22 today
-rw-rw-r-- 1 dessert dessert 0 Jun  5 17:22 yesterday
$ stat -c $'%y\t%n' * | sort -n
2018-05-30 20:22:29.919608691 +0200     last week
2018-06-05 17:22:10.207084356 +0200     yesterday
2018-06-06 17:22:01.940284127 +0200     today
$ find -maxdepth 1 -type f -printf "%T+#%Tb %Td %TH:%TM\t%p\n" | sort -rn | cut -d# -f2-
Jun 06 17:22    ./today
Jun 05 17:22    ./yesterday
May 30 20:22    ./last week
$ find -maxdepth 1 -type f -printf "%T+#%Tc\t%p\n" | sort -rn | cut -d# -f2-
Wed 06 Jun 2018 05:22:01 PM CEST        ./today
Tue 05 Jun 2018 05:22:10 PM CEST        ./yesterday
Wed 30 May 2018 08:22:29 PM CEST        ./last week
$ find -maxdepth 1 -type f -printf "%T+\t%p\n" | sort -rn
2018-06-06+17:22:01.9402841270  ./today
2018-06-05+17:22:10.2070843560  ./yesterday
2018-05-30+20:22:29.9196086910  ./last week

答案3

正如其他答案所示,该ls命令不是在这种情况下使用的最合适的工具。有一种复杂的方法可以从 的输出中提取所需的信息ls,尽管它确实有局限性。这是一个很好的例子,说明使用ls会很快变得复杂。

此命令链的具体问题是,使用该tr命令会删除任何多个空格,并用单个空格替换。这将影响文件名,使其不适合机器解析。不过,解析 ls 通常是不鼓励的行为。

ls -lrt| tail -4| tr -s ' '| cut -d ' ' -f6-| tac

ls使用 选项对结果进行反向排序-r,可以避免使用-l选项输出的“Total”行ls,并tac在最后用于在修剪掉不需要的输出后对结果进行重新排序。

相关内容