日期格式转换

日期格式转换

我正在尝试使用 awk 命令剪切三列。

-rwxrwxr-x 1 rouser users 33 Oct 19 05:20 b.sh

我使用下面的行来削减 33 Oct 19 05:20 值。

z=`ls -l b.sh | awk '{print $6,$7,$8 }'`
echo $z

z 给出的结果为 33 Oct 19 05:20 。

我的问题是,我想要这种格式的日期、月份、年份 19/10/2016。
我应该怎么办??
请尽快帮助我。

答案1

关于解析输出的一些注意事项ls

  • 格式取决于区域设置。如果需要解析它,则需要将语言环境修复为已知的内容,通常是C
  • ls -l输出中,由于用户名和组名出现在日期之前,并且可能包含空格(尽管在实践中很少见),因此您不能依赖日期始终位于第 6 个字段。最好使用ls -n数字 uid/gid 代替(或者-o-g使用具有它们的实现)。
  • 如果文件是目录类型,ls -l file则会列出其内容。你想要这个-d选项(LC_ALL=C ls -nd -- "$file"到目前为止)。
  • 如果文件名(或符号链接类型文件的符号链接的目标)包含换行符,那么您需要确保只考虑输出的第一行

    LC_ALL=C ls -nd -- "$file" | awk '{print $6,$7,$8; exit}'
    
  • 在 C 语言环境中,修改时间的格式会有所不同,具体取决于文件的最后一次修改是否是在过去 6 个月内(​​或将来)。所以你可以得到Jun 14 09:18or Feb 4 2014or Jan 1 2017if 在 2016-11-09 运行。如果未给出年份,则您不能假设该年份是当前年份。例如,如果您在一月份运行它并得到一个Dec 24 23:59,那么那就是去年的 12 月。

仍然可以像这样解决:

LC_ALL=C ls -dn -- "$file" | awk -v now="$(date +%m:%Y)" '{
  m=$6; d=$7; y=$8
  m = index("--JanFebMarAprMayJunJulAugSepOctNov", m) / 3
  if (y ~ /:/) {
    split(now, a, ":")
    y = a[2]
    if (m > a[1]) y--
  }
  printf "%02d/%02d/%04d\n", d, m, y
  exit}'

但最好是从一开始就以正确的格式获取时间。通过zsh,您可以使用它的stat内置函数:

zmodload zsh/stat
stat -LF %d/%m/%Y +mtime -- $file

在 GNU 系统上,您可以执行以下操作:

date -r "$file" +%d/%m/%Y

(尽管对于符号链接,它为您提供了目标的修改时间)。

或者:

find -- "$file" -prune -printf '%Td/%Tm/%TY\n'

在 BSD 上:

stat -t %d/%m/%Y -f %Sm -- "$file"

或者用于perl便携性:

perl -MPOSIX -le '@s = lstat shift or die "lstat: $!";
  print strftime "%d/%m/%Y", localtime $s[9]' -- "$file"

答案2

如果你想使用ls,你可以这样做: ls -l --time-style=+%d/%m/%Y

相关内容