我需要以下面的格式显示当前目录中的文件元数据。
第一列应左对齐,第二列居中,第三列右对齐到终端屏幕的右端。
答案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
(或者ls
ksh93 的内置函数,如果使用它构建的话):
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