마지막 수정 날짜가 포함된 파일 수를 볼 수 있는 누적 그래프를 생성하려면 어떻게 해야 합니까?

마지막 수정 날짜가 포함된 파일 수를 볼 수 있는 누적 그래프를 생성하려면 어떻게 해야 합니까?

내 폴더, 해당 하위 폴더 및 하위 하위 폴더에는 지난 15년 동안 수정된 수많은 파일(수백만 개)이 있습니다. 마지막 수정 날짜가 포함된 파일 수를 볼 수 있는 누적 그래프를 생성하고 싶습니다. 예를 들면 다음과 같습니다.

여기에 이미지 설명을 입력하세요.

마지막 수정 날짜가 포함된 파일 수를 볼 수 있는 누적 그래프를 생성하려면 어떻게 해야 합니까?

그게 중요하다면 우분투를 사용합니다.

답변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

관련 정보