지난 3일 동안 생성된 디렉터리를 나열하고 공간 사용량을 표시합니다.

지난 3일 동안 생성된 디렉터리를 나열하고 공간 사용량을 표시합니다.

디스크 정리의 일환으로 이제 지난 3일(현재 영업일이 아님)에 생성된 모든 폴더와 해당 콘텐츠를 삭제해야 합니다.

예 - 오늘 날짜가 20191121이면 다음과 같습니다.

/opt/png/wsm/data/workdir/batch/*20191120*
/opt/png/wsm/data/workdir/batch/*20191119*
/opt/png/wsm/data/workdir/batch/*20191118*

지금 내가 할 수 있는 일은 목록을 얻는 것뿐입니다.

ls -d */ | grep 20191118 (and then 19 and 20)

특정 날짜에 폴더와 해당 내용을 삭제하여 얼마나 많은 크기를 저장할 수 있는지 확인하는 방법은 무엇입니까?

서버의 bash 버전은 다음과 같습니다.

bash-3.2$ bash --version
GNU bash, version 3.2.57(1)-release (i386-pc-solaris2.10)
Copyright (C) 2007 Free Software Foundation, Inc.

답변1

파일과 폴더를 정리할 때 이 명령을 사용해야 할 수도 있습니다 du.

du드라이브 공간 사용량을 나열합니다.--time선택의 여지 가 있다, 그리고 사용할 수 있습니다디렉토리에만 적용. 그것들을 결합하십시오:

du -h */ --time | grep -E '2019\-09\-(18|19|20)'

이는 11월 18일, 19일 또는 20일에 콘텐츠가 마지막으로 생성되거나 수정된 ​​모든 하위 디렉터리를 검색합니다. 크기( -h사람이 읽을 수 있음), 수정 날짜 및 마지막으로 경로가 출력됩니다.

답변2

rm하려는 디렉토리에 5000개 이상의 파일이 포함되어 있으면 이전 답변은 실패합니다. 그러면 삭제되지 않은 이전 디렉터리가 남게 됩니다.

호출당 최대 5000개의 인수를 사용하여 rm을 한 번 이상 호출하는 "-exec rm {} \+" 대신 find를 사용하십시오.

수정된 파일/디렉토리를 찾으려면 find를 사용하십시오.

find . -type d -atime n  # for exact number of days
find . -type d -atime +n  # for greater than n days

-daystart 옵션을 추가하면 24시간 전이 아닌 오늘부터 시간을 측정할 수 있습니다.

그런 다음 "-exec rm {} \+"를 사용하여 삭제하거나 "-exec du -sh {} \;"를 사용하여 각 디렉터리의 디스크 사용량을 가져옵니다.

또한 검색을 최상위 디렉토리로 제한하려면 find + du 호출의 -maxlength 옵션을 고려하세요.

자세한 내용은 "man find"를 참조하세요(터미널에서(가급적)) 또는 man7.org에서 최신 매뉴얼 페이지를 받으세요:http://man7.org/linux/man-pages/man1/find.1.html, 그러나 Die.net에서는 그렇지 않습니다(페이지 타임스탬프도 제거했기 때문에 매뉴얼 페이지가 오래되었거나 만료되었는지 알 수 없습니다).

답변3

그런 다음 @Kusalananda의 솔루션을 더 짧고 (내 관점에서 볼 때) 더 읽기 쉬운 구문을 제공하고 gdate 대신 날짜를 사용하십시오(gdate가 Solaris에서 날짜와 동일할 수 있지만).

days=$(echo -e "1 day ago \n 2 days ago \n 3 days ago" | date -f - +'%Y%m%d')
dpath="/opt/png/wsm/data/workdir/batch"
for day in $days ; do
    du -s -h "$dpath/$day"
    rm -r -f "$dpath/$day"
done

답변4

Solaris 시스템에 zsh가 있는 경우 bash일반적으로 zsh도 있습니다.

<start-end>이 날짜 형식은 숫자처럼 정렬되므로 zsh의 십진수 범위 전역 연산자를 사용할 수 있습니다 .

zsh -c '
  zmodload zsh/datetime
  now=$EPOCHSECONDS day=$(( 24 * 60 * 60 ))
  for var t (start $(( now - 3*day )) end $(( now - 1*day )) )
    strftime -s $var %Y%m%d $t
  range="<$start-$end>"
  rm -rf -- *$~range*(/)
'

일광 절약 시간이 전환되는 한밤중에 실행하는 경우 현재 시간에서 24*60*60초를 빼면 같은 날 또는 2일 전에 실행될 수 있습니다.

c이러한 디렉터리에 대한 누적 디스크 사용량을 얻으려면 삭제 후 회수될 공간의 양은 해당 디렉터리의 파일이 다른 곳에 하드 링크가 있는지 여부에 따라 달라집니다 rm -rf.du -c

관련 정보