我在 CSV 文件中有文件输出,我想按日期时间排序,但日期时间显示如下,时间和年份以不同的顺序显示。
使用此命令生成文件列表:
find /Volumes/myVolume -type f -exec ls -1 -aldT {} \; |cut -c35-300 |sort -r -k5,5 -s |sort -k3,3 -s
1579099156 6 Apr 09:33:03 2023 /Volumes/myvolume/myfile
我的sort
命令有效,但由于第二个排序字段是“月份”,因此它按 Alpha 顺序对其进行排序,而我宁愿将其视为月份并按月份顺序对其进行排序。 (例如一月、二月、三月等)。
有没有办法在不改变文件列表生成方式的情况下实现这一点?
如有必要,我可以修改文件列表,这有助于我生成文件输出的递归列表,我随后可以解析该列表以执行其他任务。
我可以调整字段顺序,但我要求显示所有字段,并且文件名始终显示为最后一个。
答案1
在 OSX 上,您应该有权zsh
使用它的 glob 限定符按修改时间对匹配的文件名进行排序
/Volumes/myVolume/**/*(.DOm)
然后,您可以zstat
按照与中描述的类似方式使用其模块保存在文本文件列表中,其中包含每个文件的大小获取并打印大小和运行时间。所以要么(直接调整该方法)
zmodload -F zsh/stat b:zstat
zstat -F '%d %b %T %Y' -A data -n /Volumes/myVolume/**/*(.DOm)
for name _ _ _ _ _ _ _ size _ mtime _ _ _ in $data; do
printf '%s\t%s\t%s\n' $size $mtime $name
done
或者使用显式循环(也许更具可读性)
zmodload -F zsh/stat b:zstat
for f in /Volumes/myVolume/**/*(.NDOm); do
zstat -LF '%d %b %T %Y' -H s -- $f &&
printf '%s\t%s\t%s\n' $s[size] $s[mtime] $f
done
答案2
ls
本身具有根据日期对文件进行排序的功能:
ls -l[r]t
因此,您可以“向后”工作:ls
先准备文件列表,然后进行排序,而不是先使用然后ls
排序:
ls -lrt $(find /start/dir -type f -print)
ls
根据您的需要更改选项,但请务必包含“t”以按时间排序(也可能包含“r”以表示反向排序顺序)。
答案3
日期是一种可怕的东西,其结构各不相同。您可以使用大纪元时间吗?这是一个可以轻松排序的简单数字。此外,这将使您的命令更加便携。
尝试将其替换为您的 find exec 参数。
ls -1 -D "+%s" -alT
例子:
user@host ~ % ls -1 -D "+%s" -alT minicom.log
-rw-r--r-- 1 user group 35 +1683075462 minicom.log
user@hose ~ % ls -1alT minicom.log
-rw-r--r-- 1 user group 35 3 May 12:57:42 2023 minicom.log
如果我们采用 的纪元时间1683075462
并将其转换为date
user@host ~ % date -r 1683075462
Wed 3 May 2023 12:57:42 NZST
背景,epoch/epoc时间也称为unix时间,表示“自1970年1月1日00:00以来的秒数”