MAC OSX / Bash 问题 - 将字符串按日期排序

MAC OSX / Bash 问题 - 将字符串按日期排序

我在 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以来的秒数”

相关内容