行番号と日付を含むファイルのリスト

行番号と日付を含むファイルのリスト

各ファイルの行数と日付を表示してファイルを一覧表示したいと思います。を使用して幸せに行数を取得します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整理し、ファイル名を結合フィールドとして出力に結合します。headwcjoinstat

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' ' '

関連情報