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