ファイル名、作成時間、ファイルサイズ(GB)を使用してCSVを生成します。

ファイル名、作成時間、ファイルサイズ(GB)を使用してCSVを生成します。

次のコマンドを使用して、多くのサブディレクトリを含む大規模ディレクトリのファイル名、ファイルサイズ、および日付を抽出しました。

find MY_PATH -type f -exec ls -la --block-size=GB --time-style=+%Y-%m-%d_%H:%M:%S {} \; | awk  -F " |/" -v OFS=',' '{print $5,$6,$NF;}' > fileName.csv

私が望むもの:

  1. 単純な名前(例:)を持つファイルには機能しますtest.gzが、[Name] A - A B C_D.zipファイルに複雑な名前(例:;)があるとうまく機能します。失敗し、ファイル名の最後の部分だけを返します。
  2. 今日付はです。日付が2つの新しい列に分割されるのを防ぐために--time-style=+%Y-%m-%d_%H:%M:%S追加されました。しかし、代わりに_使用したいが、まだ日付を列として返します。space_

以下は、ディレクトリ内の一部のファイルの名前です。このようなディレクトリがたくさんあります。

[www.google.com] Learn - Complete SQL and Databases Bootcamp Zero to Mastery 2022.zip
[www.google.com] Learn - MongoDB - The Complete Developer's Guide 2022.zip
[www.google.com] Learn - SQL - The Complete Developer's Guide (MySQL, PostgreSQL).zip
[www.google.com] Learn - The Complete Oracle SQL Bootcamp (2022).zip

予想される出力はCSVcolumnsを含むファイルですname,size,date

ベストアンサー1

find提案されているようにwithを使用printfしてから、最初のフィールドを処理してバイトを次に変換します。ギブ例えば

find . -type f -printf '%s %TF %.8TT %p\n' | numfmt --to-unit=1073741824 --format='%.2f GiB'

これは、ファイル名に改行文字が含まれていないと仮定します。 OPに応じて時間とサイズを印刷する必要があります。ギブ小数点以下2桁...タイムスタンプとサイズの形式をいつでもカスタマイズできます。それぞれのマニュアルfind-printfセクションを参照)とnumfmt(参照--format)を確認してください。


前述のように、コンマで区切るか、別の順序で並べ替えるには、フォーマットを調整します。

find . -type f -printf '%f,%s,%TF %.8TT\n' | \
numfmt --delimiter=, --field=2 --to-unit=1073741824 --format='%.2f GiB'

これは、ファイル名にコンマが含まれていないと仮定します。これにより、低いASCII文字を区切り文字として使用し、次のコマンドを実行できます。

s=$'\002'
find . -type f -printf "%f,${s}%s${s},%TF %.8TT\n" | numfmt -d${s} --field=2 --to-unit=1073741824 --format='%.2f GiB' | tr -d ${s}

zsh別の方法zstat基準寸法

zmodload zsh/stat
for f in **/*(.D)
do
sz=$(( $(zstat +size $f)/1073741824. ))
mt=$(zstat -F '%F %T' +mtime $f)
printf '%s,%.2f,%s\n' $f:t ${sz} ${mt}
done

%.2f小数点を2桁以上(またはそれ以下)にしたい場合は調整してください。

おすすめ記事