90TB~50TB 범위의 파일 시스템에서 가장 오래된 파일과 관련 디렉터리를 찾아 다른 파일 시스템으로 이동해야 합니다. 디렉터리 구조는 파일의 내용을 식별하므로 디렉터리 구조를 보존해야 합니다. 그래서 -
1급/2급/3급/(문서)
구조입니다. 전체 구조를 이동해야 합니다. 최상위 디렉토리에는 아무 것도 없지만, 내가 찾고 있는 모든 파일의 이름이 동일하기 때문에 해당 파일이 없으면 파일이 무엇에 속하는지 식별할 수 없습니다. 프로세스가 완료되면 원래 파일 시스템에 약 40TB가 남아 있어야 하며 새 파일 시스템에는 거의 아무것도 남지 않아야 합니다. 이제 원래 파일 시스템에서 가장 오래된 파일이 거기에 있기 때문입니다.
감사해요!
답변1
GNU 도구 및 도구를 사용하면 rsync
다음을 수행할 수 있습니다.
export LC_ALL=C # force tools to regard those file paths as arrays
# of bytes (as they are in effect) and not do fancy
# sorting (and use English for error/warning messages
# as an undesired side effect).
find . -type f -printf '%T@/%s/%p\0' | # print mtime/size/path
sort -zn | # numerical sort, oldest first
awk -v RS='\0' -v ORS='\0' -F / -v max=50e12 '
{total_size += $2}
total_size > max {exit}
{
sub("^[^/]*/[^/]*/", "") # remove mtime/size/
print # path
}' |
rsync -nv -aHAX0 --files-from=- --remove-source-files . /dest/dir/
(테스트되지 않았습니다. -n
시험 실행에 사용됩니다. 만족하면 삭제합니다.)
%s
파일 크기( , %b
섹터의 디스크 사용량으로 대체(및 로 변경됨 )) 를 기준으로 누적 파일 크기를 계산 total_size += $2 * 512
하고 하드 링크를 무시합니다. 이러한 파일이 대상 파일 시스템에 복사되면 이러한 파일과 디렉터리에는 다음이 포함됩니다. 파일 시스템 압축이나 중복 제거가 없는 한 파일은 결국 50TB 이상을 사용할 수 있습니다.
답변2
"ls" 명령은 타임스탬프를 사용하여 약간 창의적이므로 이를 구문 분석하는 것이 어려울 수 있습니다. 이를 구현하는 언어로 구현하는 것이 훨씬 쉬울 수 있습니다.통계자료(). 일부 Unix 버전에는명령줄 통계- 근처 RH 박스에서:
find ${BASEDIR} -type f -exec stat --format="%y %b %n" {} \; | sort | less
하지만 이것은 많은 파일을 가지고 있는 개처럼 실행될 것입니다.
GNU awk에 대한 문서에는 다음이 포함됩니다.확장 예시파일 시스템 기능이 제공되지만 이를 구축하고 유지하려면 몇 가지 작업을 수행해야 합니다.
PHP, C, Perl(또는 Go, Ruby 또는 기타 여러 언어)을 사용하여 처음부터 프로그램을 작성하는 것은 쉽지만 이 기사의 범위를 벗어납니다.