xargs를 사용하여 파일을 삭제하면 No such file or Directory가 많이 인쇄됩니다(그러나 작동하는 것 같습니다...).

xargs를 사용하여 파일을 삭제하면 No such file or Directory가 많이 인쇄됩니다(그러나 작동하는 것 같습니다...).

N분보다 오래된 파일을 삭제하는 스크립트가 있습니다. 스크립트는 기본적으로 다음과 같이 실행됩니다.

find /some-folder/* -mmin +59 | xargs rm -rf

그러나 어떤 이유에서인지 다음과 같은 내용이 많이 인쇄됩니다. No such file or directory하지만 작업이 완료된 것 같습니다. 아래 예를 참조하세요.

$ du -hs /opt/storage/
5.2G    /opt/storage/
$ find /opt/storage/* -mmin +59 | xargs rm -rf
find: /opt/storage/caches/modules-2/files-2.1/org.jboss/jboss-parent: No such file or directory
find: /opt/storage/caches/modules-2/files-2.1/redis.clients: No such file or directory
find: /opt/storage/caches/modules-2/files-2.1/org.infinispan: No such file or directory
... 
$ du -hs /opt/storage/
4.0K    /opt/storage/

findxargs존재하지 않는 파일을 찾는 원인 에 대한 아이디어가 있습니까? 일종의 경쟁 조건이 있어서 파일이 발견/로그에 인쇄되기 전에 어떻게든 삭제되었을 수 있습니까?

아마도 관련이 있을 수 있습니다: https://www.linuxquestions.org/questions/linux-newbie-8/find-exec-with-rm-gives-unnecessary-error-747473/#post3646393

그러나 해결책은 xargs내가하고있는 일을 사용하는 것입니다.

고쳐 쓰다: 아래 댓글에 따르면 파일을 삭제하면 상위 폴더의 수정 시간이 업데이트되는 것이 문제인 것 같습니다. 또한 삭제 프로세스 중에 동일한 상위/시작 폴더 아래에 파일과 폴더가 생성될 수 있습니다.

이 기사에는 다음 예가 있습니다. https://stackoverflow.com/a/13869000/363603

대신 사용하세요 ctime. 그러나 다음에서 :

https://www.webservertalk.com/linux-touch-command

변경 시간 파일의 메타데이터, 속성 또는 콘텐츠가 마지막으로 변경된 시간입니다.

이로 인해 동일한 문제가 발생합니다.

find다음 과 함께 사용할 수 있는 경우 --time=birth:

https://unix.stackexchange.com/a/567590/11740

이것은 아마도 가장 강력한 솔루션일 것입니다. 그러나 지금까지 이에 대한 예를 찾지 못했습니다.

그렇다면 Linux에는 시작 폴더에서 반복적으로 파일 보존(날짜 임계값 기준)을 수행하는 "표준" 방법이 없습니다. 반면 하위 트리의 일부는 삭제/보존 중에 업데이트될 수 있습니까?

현재 솔루션: 지금까지 찾은 내용을 바탕으로 삭제할 모든 파일을 찾은 다음 삭제를 수행하는 것으로 분류했습니다.

# Store path to all files that should be deleted (potentially a lot!)
FILES_TO_DELETE=$(find /some-folder/* -mmin +59)

# Delete the file
rm -rf $FILES_TO_DELETE

답변1

디렉터리와 그 내용을 삭제한 다음 더 이상 존재하지 않는 내용을 삭제하므로 오류 메시지가 나타납니다.


수정 시간을 기준으로 디렉토리를 삭제하는 것은 아마도 좋은 생각이 아니므로 2단계 접근 방식을 선호할 수 있습니다.

  1. 파일 삭제
  2. 빈 디렉터리 삭제

-->

find /some-folder/* -type f -mmin +59 -delete \
&& find /some-folder/* -type d -empty -delete

파일과 디렉터리를 정말로 삭제하려면 -prune삭제된 디렉터리로 내려가지 않고 사용할 수 있습니다.

find /some-folder/* -mmin +59 -exec rm -rf {} \; -type d -prune

를 사용하려면 -delete(파일에만) 또는 -exec rm -rf {} \;를 사용하고 , null로 구분된 출력을 사용하도록 선택해야 합니다. 이러한 옵션 중 일부는 해당 버전에서 사용하지 못할 수도 있습니다.xargs ...xargs-print0xargs -0find

관련 정보