すべてのファイルのリスト(サイズを含む)をテキストファイルとして保存しようとしています。
このコマンドを使用すると、ファイルfind *> yourfilename.csv
名のみをエクスポートできます。
ファイルサイズをどのように追加しますか?
ベストアンサー1
bash
Linux(または互換性のある実装を含むシステム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
bash
OpenBSD(または同様の実装を持つ他の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参照パス名を考慮しません。