各ファイルの行数と日付を表示してファイルを一覧表示したいと思います。を使用して幸せに行数を取得しますwc -l *
。問題ではない。を使用して日付を取得できますls -l
。
これら2つのコマンドを組み合わせて列に単一の出力を提供する方法はありますか?
答え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
たとえば、選択肢の1つを使用することも可能です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
(シェルがグローバル演算子を拡張するのを防ぐために、パターンの周りの単一引用符を参照してください*
)。
答え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' ' '