30일이 지난 파일 찾기 및 삭제

30일이 지난 파일 찾기 및 삭제

30일이 지난 사용자 파일을 삭제하고 싶습니다. 아래 bash 스크립트는 잘 작동합니다. 그러나 자체 에코가 있으므로 출력에 표시된 "해당 파일 또는 디렉터리 없음" 오류를 제거하고 싶습니다. 누구든지 도와줄 수 있나요?

암호:

if [[ $(find /h/$USER/*.txt -mtime +30) ]]
then
    find /h/$USER/*.txt -mtime +30 -print -exec rm -f {} \;
else
    echo "No txt files to del"
fi

산출:

find: stat() error /h/username/*.txt: No such file or directory
No text files to del

답변1

이것이 제가 하는 방법입니다. 매일 밤 정리하고 싶은 여러 디렉토리에서 실행하는 것입니다.

find /h/$USER -maxdepth 1 -name "*.txt" -type f -mtime +30 -delete

이것이 최선인지 최악인지는 말할 수 없지만 몇 년 동안 아무런 문제 없이 실행되어 왔으며 실제로는 모두 동일한 구문과 문제가 없는 가비지 클리너 모음이므로 프로덕션용으로는 충분할 것 같습니다.

답변2

여기서 문제는 findtxt 파일을 나열하는 대신 쉘 glob을 사용하고 있다는 것입니다(숨겨진 txt 파일도 제외하고 .txt파일이 디렉토리 유형인 경우 그 파일에 들어가 이전 파일을 모두 삭제합니다). 이와 같은 쉘은 bashglob이 어떤 파일과도 일치하지 않을 때 glob을 있는 그대로 전달 find하고 find존재하지 않는 *.txt파일에 대해 불평합니다.

다음을 수행할 수 있습니다.

LC_ALL=C find "/h/$USER/." ! -name . -prune \
  -name '*.txt' ! -type d -mtime +30 -print -exec rm -f {} + |
  grep '^' > /dev/null || echo >&2 No text files to del

이는 출력이 생성되었는지(오류 없음) grep확인하기 위한 것이므로 find출력합니다.삭제할 텍스트 파일이 없습니다.그렇지 않은 경우 메시지가 표시됩니다( > /dev/null삭제하려는 파일을 정말로 보려면 삭제하십시오). find프로세스의 종료 상태가 손실된다는 점에 유의하세요 .

zshglob을 사용하여 파일 수명을 확인할 수도 있습니다 (이미 zsh인용하지 않고 구문을 사용하고 있습니다 $USER).

oldfiles=(/h/$USER/*.txt(NDm+30^/))
if (($#oldfile)); then
  rm -f -- $oldfiles
else
  echo >&2 No text files to del
fi

어쨌든 -find -mtime +30zsh의 glob 한정자의 m+30경우 기간을 정수 일수로 비교하기 때문에 31일 이상 된 파일을 선택한다는 점에 유의하세요. 30일 23시간이 지난 파일은 해당 기간이 30일로 반올림되고 30보다 크지 않기 때문에 선택되지 않습니다.

답변3

다음 명령을 사용하여 오류를 /dev/null로 리디렉션합니다. 그러면 오류가 표시되지 않습니다.

find path -type f -daystart -mtime +30 -exec rm -rvf {} \;  2>/dev/null

답변4

12월의 파일을 삭제하고 싶다고 가정해 보겠습니다. 먼저 파일을 나열하고 ls -l|grep "Dec" 두 번째로 만족스러우면 삭제 rm ls -l|grep "Dec" 피드백을 알려주세요. :)

관련 정보