还有比这更好的方法来按文件的创建日期对文件进行排序吗?

还有比这更好的方法来按文件的创建日期对文件进行排序吗?

我需要显示按创建日期排序的目录列表,我想出了这个我认为很聪明的代码片段。有没有一种更明显的方法可以做到这一点,而我却错过了?

printf "%-20s\t\t\t%-s\n" "DATE" "CASE"
printf "%-20s\t\t\t%-s\n" "----" "----"

find $idir -mindepth 3 -maxdepth 3 -type d -printf "%T@ %Tc\t\t%p\n" \
     | sed "s#${idir}/##" \
     | sort -h \
     | sed "s#^[^ ]* ##"

样本输出

DATE                                    CASE
----                                    ----
Fri 06 Sep 2013 11:17:41 AM EDT         dir1/Baseline/2013_09_06_11_16_10
Fri 06 Sep 2013 01:44:38 PM EDT         dir2/Baseline/2013_09_06_13_42_48
Sun 08 Sep 2013 05:02:46 PM EDT         dir3/6 Month/2013_09_08_17_02_05
Fri 13 Sep 2013 02:28:30 PM EDT         dir4/Baseline/2013_09_13_14_25_09

细节

上面的内容将从目录中查找正好 3 个目录$idir。然后它会打印在此深度找到的任何目录的创建时间。然后,我从$idir输出中剥离路径的部分(不需要它),对其进行排序,然后砍掉%T@输出的部分。这只是为了让我可以更轻松地对输出进行排序。

如果没有尾随,sed输出看起来像这样:

DATE                                    CASE
----                                    ----
1378480661.2612650000 Fri 06 Sep 2013 11:17:41 AM EDT           dir1/Baseline/2013_09_06_11_16_10
1378489478.3223970000 Fri 06 Sep 2013 01:44:38 PM EDT           dir2/Baseline/2013_09_06_13_42_48
1378674166.7427782000 Sun 08 Sep 2013 05:02:46 PM EDT           dir3/6 Month/2013_09_08_17_02_05
1379096910.4431689000 Fri 13 Sep 2013 02:28:30 PM EDT           dir4/Baseline/2013_09_13_14_25_09

向我展示一种更清洁的方法!

答案1

没有好的、可移植的方法来按文件时间对文件进行排序。最便携的方法是:

  • 如果您可以假设文件名仅包含可打印字符,请调用ls -ltd.
  • 否则,请使用 perl。

这是使用 GNU 工具按日期对文件进行排序的经典方法。您假设文件名不包含换行符;通过更改\n\0并使用sort该选项进行调用可以轻松解决此问题-z。哦,还有,别再打迂回sed电话了;请注意,如果$idir包含任何字符,您的脚本将无法工作,#*^$\[因为 sed 会将它们解释为特殊字符。

cd "$idir" &&
find -mindepth 3 -maxdepth 3 -type d -printf '%T@ %Tc\t\t%p\0' |
sort -hz |
tr '\0\n' '\n\0' |
sed 's/^[^ ]* //'

顺便说一句,您是按文件的修改时间而不是创建时间对文件进行排序。除 OSX 之外的大多数 UNIX 变体都不支持自始至终的创建时间(从文件系统到内核再到用户区工具)。

按修改时间对文件进行排序的简单、干净的方法是使用 zsh。 glob 限定符om按年龄递增对文件进行排序(用于Om首先获取最旧的文件)。

files=(*(om))
echo "The oldest file is $files[-1]"

要获得像您所显示的那样的输出,您可以使用zstat

zmodload zsh/stat
describe () {
  typeset -A st
  zstat -s -H st "$REPLY"
  echo "$st[mtime] $REPLY"
}
: */*/*(/+describe)

相关内容