各ファイルのサイズとともにテキストファイルのリストに保存されます。

各ファイルのサイズとともにテキストファイルのリストに保存されます。

すべてのファイルのリスト(サイズを含む)をテキストファイルとして保存しようとしています。

このコマンドを使用すると、ファイルfind *> yourfilename.csv名のみをエクスポートできます。

ファイルサイズをどのように追加しますか?

ベストアンサー1

bashLinux(または互換性のある実装を含むシステムstat)でシェルを使用する:

shopt -s globstar dotglob nullglob

for pathname in ./**/*; do
    if [[ -f $pathname ]] && [[ ! -h $pathname ]]; then
        stat -c $'%s\t%n' "$pathname"
    fi
done >outfile.csv

bashOpenBSD(または同様の実装を持つ他のBSDシステムstat)の場合は、次を使用します。

shopt -s globstar dotglob nullglob

for pathname in ./**/*; do
    if [[ -f $pathname ]] && [[ ! -h $pathname ]]; then
        stat -f '%z%t%N' "$pathname"
    fi
done >outfile.csv

どちらも現在のディレクトリ内または下のすべての名前を繰り返します。各一般ファイルに対してstatファイルサイズをバイト単位で呼び出して表示し、タブの間にファイルパス名を印刷します。


シェルのみzshを使用:

zmodload -F zsh/stat b:zstat
zstat -n +size ./**/*(D.)

これにより、組み込みzstatコマンドをシェルで使用でき、現在のディレクトリ内または下にあるすべての一般ファイル(隠し名前を含むファイルを含む)のパス名と見かけのファイルサイズ(バイト)を取得できます。

少数の小さなファイルのみを含む浅いディレクトリの場合、出力は次のようになります。

./file1 136
./file2 136
./somedir/file3 136

...だからCSVとは全く違います。

これは簡単なループでも行うことができ、より正確にフォーマットすることができます。

zstat -L -A data -n +size ./**/*(D.)
for name size in $data; do
    printf '%s\t%s\n' $size $name
done >outfile.csv

これは、現在ディレクトリ内またはその下にあるすべての一般ファイルを呼び出し、zstat結果を配列に保存してから、その配列dataのエントリ(パス名とファイルサイズが交互に変更されます)を繰り返します。パス名とサイズのペアごとにサイズ(バイト単位)を最初に印刷し、次にタブとパス名を印刷します。ここで、出力はoutfile.csv現在のディレクトリに配置されます。

ループを削除しますが、より曖昧なコードで支払う短縮バージョンです(printfフォーマット文字列に慣れていない場合)。

zstat -L -A data -n +size ./**/*(D.)
printf '%2$s\t%1$s\n' $data >outfile.csv

形式printf%2$s\t%1$s\n、2つのパラメータを文字列として出力する必要がありますが、dataそれらの間にタブ文字を使用して反対の順序(配列はパス名とファイルサイズのペアをその順序で格納する)として出力する必要があることを指定します。data配列がすべて消費されるまで、パス名とファイルサイズのペアごとにフォーマットが繰り返されます。


上記のバリエーションのどれも、タブまたは改行文字を含むCSV参照パス名を考慮しません。

おすすめ記事