列出包含行数和日期的文件

列出包含行数和日期的文件

我希望能够列出文件,显示每个文件的行数和日期。我可以很高兴地使用 获得行数wc -l *。不是问题。我可以使用 获取日期ls -l

有没有办法结合这两个命令来为我提供列中的单个输出?

答案1

这是带有find+ wc+ 的东西date

find . -maxdepth 1 -exec sh -c '[ -f "$0" ] && \
  printf "%6s\t\t%s\t%s\n" "$(wc -l<"$0")" "$(date -r "$0")" "$0"' {} \;

date -r也可以使用例如代替之一stat -c%y

输出如下所示:

   394      Thu Oct 16 22:38:14 UTC 2014    ./.zshrc
     7      Thu Oct 30 11:19:01 UTC 2014    ./tmp.txt
     2      Thu Oct 30 06:02:00 UTC 2014    ./tmp2.txt
    40      Thu Oct 30 04:16:30 UTC 2014    ./pp.txt

以此为起点,我们可以创建一个接受目录和模式作为参数的函数:

myls () { find "$1" -maxdepth 1 -name "$2" -exec sh -c '[ -f "$0" ] && \
  printf "%6s \t\t%s\t%s\n" "$(wc -l<"$0")" "$(date -r "$0")" "$0"' {} \;; }

之后myls /tmp '*.png'将仅列出来自的图像/tmp(注意模式周围的单引号以防止 shell 扩展全局运算符*)。

答案2

基于 - 的解决方案find看起来是最优雅的,但只是为了好玩,这里有一些其他方法来解决这个问题。

这个使用sed&head清理 的输出wc,然后使用文件名作为连接字段join将其组合到 的输出。stat

pat="A*";join -1 2 -2 1 -t ' ' <(wc -l $pat|head -n-1|sed 's/^[ ]*//') <(stat -c '%n %y' $pat) | awk '{printf "%-20s %6s %s %s %s\n",$1,$2,$3,$4,$5}'

还有一种更简单的方法,使用pasteawk再次整理列并检查文件名是否匹配。

pat="A*";paste -d ' ' <(wc -l $pat) <(stat -c '%n %y' $pat) | awk '$2==$3{printf "%6s %s %s %s\n", $1, $4, $5, $2}'

然而,如果名字匹配(当此命令运行时文件列表会发生变化),则错误将不可见。但这个版本报错:

pat="A*";paste -d ' ' <(wc -l $pat) <(stat -c '%n %y' $pat) | awk '$2==$3{printf "%6s %s %s %s\n", $1, $4, $5, $2;next};{print "Error:" $0}'

当然,它会在最后一行打印一条错误消息,但这很容易修复。或者忽略。 :)

答案3

我使用的是awk如下图所示:

wc -l * | head --lines=-1 | while read num file
do
  echo -n $num" "
  ls -l $file | awk '{
     for (i=6; i <= NF; i++)
       printf $i " "
  }'
  echo
done
  • head用于删除最后一行(wc输出的总行)。
  • num包含 的行数file
  • awk用于打印ls -l输出的时间输出。

答案4

关于什么 :

ls -lrth yourfile|awk '{print $6 $7 " " $8 system("wc -l " $9) }' | tr '\n' ' '

相关内容