我正在使用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+
对输出进行正确排序,然后由cut
aftwerwards 删除。阅读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
在最后用于在修剪掉不需要的输出后对结果进行重新排序。