私が望むのは、ディレクトリを繰り返してサブディレクトリに関する情報を非常に特定の形式で出力して、ユーザーに適していて、後で、awk
などgrep
のツールを使用して解析できるようにすることですsed
。
これはbashスクリプトの関数内で実行され、ユーザー端末に印刷されます。遺言に似ていますls
が、特定の列、順序、フィールドがあります。その上に関数を再実行し、awk
興味のあるディレクトリだけをキャプチャするなどのタスクにパイプし、そのディレクトリdiff
に対して別のタスクを実行します。
~/Parent/2017
Directory Name Size Last Modified Number of Files
2017-08-25 1.9 GB Aug 30 16:39 141
2017-08-26 152 MB Aug 27 12:57 48
2017-08-29 5.9 GB Aug 30 7:19 462
2017-08-30 102 MB Sep 2 14:36 20
2017-08-31 2.0 GB Sep 1 9:18 148
2017-09-01 1.2 GB Sep 5 10:21 89
私のParent
ディレクトリが次のようなとき
> ls -l ~/Parent/
2015
2016
2017
Backups
Catalog-file.data
'Temporary Folder DE2B14BB-1052-4FF0-B4E7-B94C0E3CC6F8'
backup-logs
rsync.log
今まで私はこのようなものを持っています
IFS=$'\n';
for d in `find -maxdepth 1 -type d | grep -P "\d{4}" | grep -v -P "[a-z]+"`; do
for sd in `find ${d} -maxdepth 1 -type d`; do
file_count=`ls -lh ${sd} | wc -l`
done
ls -lh ${d} | awk -v fc="$file_count" '{printf "%-13s %-8s %-5s %-5s %-8s %-8s \n", $8, $4, $5, $6, $7, fc}'
done
私はそれが正しく動作しないことを知っています。私は今まで持っているコードを提供しましたが、恥ずかしいです。file_count
各出力ラインに対して変数()を保存する方法はawk
?注:ls
「サイズ」列を変数に置き換えるには、この情報が必要な場合があります。du -sh directory_name
通常、問題を解決し続けることができます。しかし、その地点に到達したとき、おそらく難しい方法でやったかもしれないし、より簡単な方法があるかもしれないと思いました。どう思いますか?そのようなサイクルは2つありますか?それとももっと簡単な方法がありますか?
答え1
GNUツールを使用すると、次のことができます。
find . \( -path './*/*' -o -type d \) -printf '%TF %TH:%TM/%s/%p\0' |
gawk -F/ -v 'RS=\0' '
BEGIN{split("K/M/G/T/P/E/Z/Y", u)}
function h(n, i) {
while (n >= 1024) {n /= 1024; i++}
return sprintf("%.4g%s", n, u[i])
}
{s[$4] += $2; n[$4]++}
NF == 4 {t[$4] = $1}
END{
PROCINFO["sorted_in"] = "@ind_str_asc"
for (d in t) printf "%-13s %-8s %s %s\n", d, h(s[d]), t[d], n[d]
}'
つまり、数量と累積を計算することです。確かに繰り返しディレクトリ内のすべてのファイルのサイズ(ディスク使用量ではない)(より深いファイルを考慮したくない場合は1つ追加)-maxdepth 2
。find
ディスク使用量の場合、ブロック数を計算してハードリンクを一度だけ計算すると、より複雑になります。
答え2
スクリプトの特定の部分に対するfind
GNUコマンドの操作に慣れていますか-printf
?現在実行している操作に応じてファイル情報の表示をカスタマイズできます。ファイル検索と表示の両方を実行すると、スクリプトを簡素化できます。
このコマンドの柔軟性を説明するには、次のようにします。
find -name '*.sh' -printf 'Script %P last accessed on %D at %r. Owned by %u with permissions set to %M'
...同様の結果...
Script foo.sh last accessed on 03/01/17 at 10:15 PM. Owned by joe.blow with permissions set to -rwx-r-x-r-x
Script bar.sh last accessed on 03/22/17 at 02:42 AM. Owned by joe.blow with permissions set to -rw--r---r--
考えられるほとんどすべてのファイル属性に対して約30の異なるディレクティブがあり、日付形式はそれに基づいているため、strftime
非常に強力で柔軟です。これらのフラグには、左/右揃え、最小数値幅などの一般的な修飾子もあります。