ファイル名とファイルサイズをCSV形式でキャプチャするシェルスクリプト

ファイル名とファイルサイズをCSV形式でキャプチャするシェルスクリプト

特定のフォルダに多くのzipファイルがあります。ファイル名とファイルサイズを1日に1ファイルずつファイル名とサイズを含むcsv形式でキャプチャしたいと思います。ファイル名には日付が含まれています。

ファイルは次の場所にあります。/somedirectory/archive/test

-rw-rw-r--+ 1 AAAA AAAA 9.3M May  30 17:09 XXXXX_20140530_0401_28.txt.gz
-rw-rw-r--+ 1 AAAA AAAA 9.3M May  30 17:09 XXXXX_20140530_0401_29.txt.gz
-rw-rw-r--+ 1 AAAA AAAA 9.3M May  31 17:09 XXXXX_20140531_0401_01.txt.gz

私は毎日実行して同じCSVをキャプチャするcronjobを作成したいと思います。

test30052014.csv

"XXXXX_20140530_0401_28.txt.gz","9.3","May 30"
"XXXXX_20140530_0401_29.txt.gz","9.3","May 30"

test31052014.csv

"XXXXX_20140531_0401_01.txt.gz","9.3","May 31"

答え1

システムにGNU coreutilsがある場合、人間が読めるファイルサイズを取得する最も簡単で信頼性の高い方法は、コマンドを使用することですdu。目的の形式で出力を印刷するには、bashを使用して次のようにします。

#!/bin/bash

while read -rd $'\0' size name
do 
  printf '"%s","%s"\n' "${name##*/}" "$size"
done < <(du -0h /somedirectory/archive/test/XXXXX_20140530_*.gz)

答え2

なぜ高速シェルスクリプトを使用しないのですか? (例えばsize.shと呼びましょう):

#!/bin/bash
IFS='
'
for LINE in $(ls -1s --block-size=k|tail -n +2); do 
  echo $LINE|awk '{ print "\""$2"\",\""$1"\"" }'
done

サイズはキロバイト単位で一貫して出力され、スクリプトの出力をファイルにリダイレクトできます。

size.sh > $(date +%Y-%m-%d).csv

関連情報