在格式化列中显示文件元数据

在格式化列中显示文件元数据

我需要以下面的格式显示当前目录中的文件元数据。

第一列应左对齐,第二列居中,第三列右对齐到终端屏幕的右端。

答案1

使用 GNU find(可能gfind在您的系统上可用):

find . -mindepth 1 -maxdepth 1 -printf '%-58P %TF %AF\n'

将以 YYYY-mm-dd 格式打印文件名、上次修改日期(如果您愿意,文件内容的创建日期)和上次访问日期。

要限制为过去 365 天内未访问的文件.txt.bkp

find . -mindepth 1 -maxdepth 1 \
  \( -name '*.txt' -o -name '*.bkp' \) \
  -atime +364 -printf '%-58P %TF %AF\n'

只要文件名不包含控制字符、多字节字符、零宽度字符或双宽度字符,并且长度不超过 58 个字节,列就应该对齐。

第一列左对齐,第三列右对齐(假设终端宽度为 80 列),第二列向右移动,为文件名留出空间。如果您确实希望文件名居中,请调整文件名宽度和间距。

请注意,文件列表未排序。

使用 ast-open ls(或者lsksh93 的内置函数,如果使用它构建的话):

ls -AZ '%-58(name)Ls %(mtime:%F)s %(atime:%F)s'

应保留多字节、零宽度和双宽度字符的对齐并对列表进行排序。

zsh

#! /bin/zsh -
zmodload zsh/stat
for f (*(DN)) {
  stat -LH s -F %F -- $f &&
    printf '%-58s %s %s\n' $f $s[mtime] $s[atime]
}

要限制为过去 365 天内未访问的文件,请.txt替换为..bkp*(DN)*.(txt|bkp)(DNa+364)

应保留多字节字符的对齐并对文件名进行排序。

由于没有标准命令可以以可靠的方式检索修改和访问时间,因此像往常一样,您最好的选择可能是使用perl

perl -MPOSIX -Mlocale -Mopen=locale -MEncode::Locale -MEncode -e '
  opendir D, "." || die "open .: $!\n";
  for (
    sort {$a->[1] cmp $b->[1]}
      map {[$_, decode(locale => $_)]}
      grep {!/^\.{1,2}\z/}
      readdir D
  ) {
    if (@s = lstat$_->[0]) {
      printf("%-58s %s %s\n", $_->[1],
        map {strftime("%Y-%m-%d", localtime $_)} ($s[9], $s[8]))
    } else {warn "$_: $!\n"}
  }'

与该zsh方法一样,它应该保留多字节字符的对齐方式,并根据区域设置排序规则对文件名进行排序。

由于 Solaris 10 附带的版本很旧perl,您可能不得不放弃对文件名中非 ASCII 字符的支持,这将简化为:

perl -MPOSIX -e '
  opendir D, "." || die "open .: $!\n";
  for (sort grep {!/^\.{1,2}\z/} readdir D) {
    if (@s = lstat$_) {
      printf("%-58s %s %s\n", $_,
        map {strftime("%Y-%m-%d", localtime $_)} ($s[9], $s[8]))
    } else {warn "$_: $!\n"}
  }'

要限制为过去 365 天内未访问的文件,请.txt替换为.bkp!/^\.{1,2}\z//\.(txt|bkp)\z/ && -A > 365

相关内容