各ファイルのファイル名、ファイル行数、ファイルサイズを抽出します。

各ファイルのファイル名、ファイル行数、ファイルサイズを抽出します。

フォルダ内のファイルセットの情報を再帰的にキャプチャし、次のようにパイプで区切られた別のファイルに書き込む最良の方法があると思います。

出力ファイルの例。

FOLDER_NM|FILE_NM|FILE_CNT|FILE_SIZE|DATE . 

SOME_FLD|xyz|35|350 MB| 10-05-2018  
SOME_FLD|abc|10|440 MB| 10-05-2018
SOME_FLD|pqr|85|800 MB| 10-05-2018 
SOME_FLD|lmn|40|200 MB| 10-05-2018 

答え1

あなたのlinuxタグは、あなたのシステムでstatGNUを使用できることを示します。sed

stat -c"%n|%s|%y" SOME_FLD/* | sed -r 'h; s/\|.*$//; s/^/wc -l </e; G; s/\n/|/; s/^([^|]*\|)([^|]*\|)/\2\1/; s/( [^ ]*){2}$//; s#/#|#' 
SOME_FLD|abc|235|2808|2018-10-05
SOME_FLD|lnm|235|2808|2018-10-05
SOME_FLD|pqr|235|2808|2018-10-05
SOME_FLD|xyz|235|2808|2018-10-05

stat必要なデータフィールドを一覧表示し、行を保存バッファに保存してから、ファイル名(GNU拡張子)に対してコマンドを実行しsed、関連フィールドをwc -l要求された順序で混在させ、少しトリミングします(日付から時間フィールドを削除します)。 、lilesのパスをtoに/置き換えます。|

答え2

最新バージョンを使用してくださいperl

find "$PWD" -type f -exec perl -MPOSIX -MNumber::Bytes::Human=format_bytes -e '
  while (<<>>) { if (eof) {
    my ($d, $f) = $ARGV =~ m{.*/(.*)/(.*)}s;
    my @s = stat ARGV;
    print join("|", $d, $f, $., format_bytes(tell ARGV),
               strftime("%Y-%m-%d", localtime $s[9])) . "\n";
    close ARGV;
  }}' {} +

(空のファイルをスキップして(逆にwc -l)、最後の改行以降の文字を1行に数えます。)

または以下を使用してzsh

#! /bin/zsh -
zmodload zsh/stat
human() {
  local suffix
  REPLY=$1
  for suffix ('' K M G T P E) {
    ((REPLY<1024)) && break
    ((REPLY /= 1024.))
  }
  printf -v REPLY '%.1f%s' $REPLY $suffix
}
for file ($PWD/**/*(D-.)) {
  zstat -F %F -H info -- $file &&
    lines=$(($(wc -l < $file))) &&
    printf '%s\n' "$file:h:t|$file:t|$lines|$info[size]|$info[mtime]"
}

しかし、これはwc -lファイルごとに1つずつ実行するという意味なので、非常に非効率的です。

関連情報