我希望能够列出文件,显示每个文件的行数和日期。我可以很高兴地使用 获得行数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}'
还有一种更简单的方法,使用paste
,awk
再次整理列并检查文件名是否匹配。
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' ' '