次のコマンドを使用して、多くのサブディレクトリを含む大規模ディレクトリのファイル名、ファイルサイズ、および日付を抽出しました。
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
私が望むもの:
- 単純な名前(例:)を持つファイルには機能します
test.gz
が、[Name] A - A B C_D.zip
ファイルに複雑な名前(例:;)があるとうまく機能します。失敗し、ファイル名の最後の部分だけを返します。 - 今日付はです。日付が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
予想される出力はCSV
columnsを含むファイルです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桁以上(またはそれ以下)にしたい場合は調整してください。