如何生成累积图,在其中可以查看最后修改日期的文件数量?

如何生成累积图,在其中可以查看最后修改日期的文件数量?

我的文件夹、其子文件夹及其子子文件夹中有大量(数百万)文件,这些文件在过去 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

该命令为一行:

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 将任何东西变成一行,但是否应该完全取决于你自己。如果你想定义一次用于 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

相关内容