내 디렉터리에는 2010년의 파일이 포함되어 있습니다. 500일이 지난 모든 파일을 삭제하고 싶습니다. 다음을 시도했습니다.
find /var/log/arc/* -type f -mtime +500 -delete {}\;
하지만 나는 그것을 이해합니다:
-bash: /usr/bin/find: Argument list too long
제가 아는 한 이는 파일이 너무 많아 find
처리할 방법이 없다는 의미입니다. 하지만 +2000
3년 넘게 시간을 투자한 후에도 여전히 이것을 얻습니다.
내가 여기서 무엇을 놓치고 있는 걸까요?
답변1
find
파일 목록이 입력으로 필요하지 않은 경우가 누락되었습니다 . 문제는 glob이 /var/log/arc/*
너무 많은 파일로 확장된다는 것입니다. 그러나 find
하위 디렉터리로의 반복은 기본적으로 수행되므로 glob을 전혀 사용할 필요가 없습니다.
find /var/log/arc/ -type f -mtime +500 -delete
-delete
비표준 술어입니다. 구현이 이를 지원하지 않는 경우 find
다음을 사용할 수 있습니다.
find /var/log/arc/ -type f -mtime +500 -exec rm -f {} +
대신에.
답변2
면책조항: 저는 현재입니다생가죽(오른쪽 회전) (바라보다https://github.com/raforg/rawhide)
당신이 놓치고 있는 것은찾다디렉터리( /var/log/arc
)만 필요하며 디렉터리( )의 모든 파일이 필요하지는 않습니다 /var/log/arc/*
. /*
및 {}\;
(거기에 없어야 함) 을 제거하면 문제가 해결됩니다.GNU 찾기. 비GNU 찾기-delete {}\;
, 로도 바꿔야 합니다 -exec /bin/rm '{}' \;
.
FWIW, 대안찾다내 것이 되어라생가죽(오른쪽 회전) 프로그램. 이를 통해 다음을 수행할 수 있습니다.
rh -UUU /var/log/arc 'f && old(500*days)'
매우 유사하지만 더 짧고 읽기 쉽습니다.
-UUU
일치 항목을 연결 해제/삭제/제거합니다.
f
(또는 file
)은 일반 파일과 일치합니다.
old(500*days)
최소 500일 전에 수정된 파일과 일치합니다.