最後の変更日を含むファイル数を表示できる累積グラフを作成するにはどうすればよいですか?

最後の変更日を含むファイル数を表示できる累積グラフを作成するにはどうすればよいですか?

マイフォルダ、そのサブフォルダ、およびサブサブフォルダには、過去15年間に変更された多数のファイル(数百万個)があります。最後の変更日を含むファイルの数を表示できる累積グラフを作成したいと思います。たとえば、次のようになります。

ここに画像の説明を入力してください。

最後の変更日を含むファイル数を表示できる累積グラフを作成するにはどうすればよいですか?

それが重要な場合は、Ubuntuを使用してください。

答え1

次のようにしてみてください。

find . -type f -printf '%TY-%Tm\n' | sort | uniq -c | gnuplot -p -e '
  set xdata time;
  set timefmt "%Y-%m";
  set format x "%Y-%m";
  set xtics rotate by 30 right;
  set xlabel "Last modified date";
  plot "-" using 2:1 with lines title "count"'

mlr -p bar -f 1テキストバーグラフを取得するには、gnuplotの置き換えを参照してください。

答え2

bash / pythonを混在させるのが好きな場合は、matplotlib / pandas / seabornを使用して実行できます。私は散布図を使って時系列を描くのが大好きです。

pip install --user seaborn matplotlib pandas

コマンドは1行です。

sudo find / -printf "%TY-%Tm-%Td\n" | sort | uniq -c | sort -n | python -c 'import sys; import seaborn as sns; import matplotlib.pyplot as plt; import pandas as pd; from datetime import datetime; sns.scatterplot(data=pd.DataFrame([{"y": int(index.strip().split(" ").pop(0)), "x": datetime.strptime(index.strip().split(" ").pop(1), "%Y-%m-%d")} for index in sys.stdin.readlines() if int(index.strip().split(" ").pop(0)) > 1]), x="x", y="y") ; plt.xticks(rotation=90) ; plt.show()'

時々役に立つこともありますが、このマシンでも時間がかかり、今回のリリース-maxdepth 3以降に追加しないfind /と変更されたファイルが1個未満の日付もスキップされますint(index.strip().split(" ").pop(0)) > 1

時間を最小限に抑えるために、GNU並列処理などを使用できます。

apt install parallel

find / -type d -mindepth 3 -maxdepth 3 | parallel -j8 find {} -type f -printf '"%TY-%Tm-%Td\\n"' | sort | uniq -c | sort -n

sudo find / -type d -mindepth 3 -maxdepth 3 | parallel -j8 find {} -type f -printf '"%TY-%Tm-%Td\\n"' | sort | uniq -c | sort -n | python -c 'import sys; import seaborn as sns; import matplotlib.pyplot as plt; import pandas as pd; from datetime import datetime; sns.scatterplot(data=pd.DataFrame([{"y": int(index.strip().split(" ").pop(0)), "x": datetime.strptime(index.strip().split(" ").pop(1), "%Y-%m-%d")} for index in sys.stdin.readlines() if int(index.strip().split(" ").pop(0)) > 1]), x="x", y="y") ; plt.xticks(rotation=90) ; plt.show()'

また、matplotlibビューアでデータセットを拡大して特定の日付範囲に範囲を絞り込むことができることも指摘したいと思います。

非常に高いレベルを見る:

ここに画像の説明を入力してください。

  • 実行するのに約2分かかります

デフォルトでは、Pythonを使用すると何でも1行に置き換えることができますが、そうする必要があるかどうかは完全にあなた次第です。 Bashスクリプトで使用するためにPython関数を一度定義するには、heredocを使用する必要があります。以下は、あなたが興味を持っているかもしれないHeredocに関するいくつかの情報を含む他のコンテンツのリストです。

https://stackoverflow.com/questions/2374640/how-do-i-calculate-percentiles-with-python-numpy

https://stackoverflow.com/questions/30702519/python-c-vs-python-heredoc

https://stackoverflow.com/questions/38436215/can-i-save-ipython-command-line-history-to-a-notebook-file

関連情報