지난 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개 이상의 파일이 포함되어 있으면 이전 답변은 실패합니다. 그러면 삭제되지 않은 오래된 디렉토리가 남게 됩니다.

대신 find를 "-exec rm {} \+"와 함께 사용하면 각 호출에 대해 최대 5000개의 인수로 rm을 한 번 이상 호출합니다.

수정된 파일/디렉토리를 찾으려면 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 옵션을 고려하여 최상위 수준의 디렉터리로 find를 제한하세요.

자세한 내용은 "man find"를 참조하십시오(최신 매뉴얼 페이지를 얻으려면 터미널(best) 또는 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 시스템에 가 있으면 bash일반적으로 zsh도 있습니다.

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

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. 제거한 후 회수될 공간의 양은 해당 디렉토리의 파일이 다른 곳에 하드링크를 가지고 있는지 여부에 따라 달라집니다.

관련 정보