4억 개의 파일이 있는 디렉토리가 있습니다. find를 사용하여 다음과 같은 모든 파일 목록을 만들었습니다.
/output/custom/31/7/31767937
/output/custom/31/7/317537a
/output/custom/31/7/317537
/output/custom/31/7/317ab
/output/custom/31/7/317bo
/output/custom/31/7/317je
/output/custom/31/7/317ma
/output/custom/31/7/31763
그런 다음 파일을 20개의 서로 다른 파일로 분할하고 스크립트를 실행하여 20개의 서로 다른 타르볼을 생성했습니다.
for i in $(ls x*)
do
tar -cf /tar/$i.tar -T $i &
done
입력 파일은 /tar
마운트 지점과 다른 드라이브에 있습니다. 스크립트는 현재 2일 동안 실행되었으며 약 1/4 정도 완료되었습니다. 아마 지금은 계속 실행 상태로 두었을 것입니다. 그러나 나중에 참고할 수 있도록 tar
?를 사용하는 것보다 더 좋은 방법이 있는지 궁금합니다 .
나의 궁극적인 목표는 이 타르볼을 20개의 다른 서버로 옮기고, 압축을 풀고, 파일에 대해 일부 스크립트를 실행하는 것입니다. 아, 이제 타르볼이 생겼으니 S3 저장소에도 넣어보겠습니다.
답변1
이동의 용이성 측면에서는 을 추천합니다 rsync
.
이점
- 모든 것을 수행하는 하나의 명령, 모두를 찾는 하나의 명령
- 전송 중 네트워크가 끊어지면 재시작 가능
- 작업량이 적습니다. 분할/타르한 다음 전송/압축 해제할 필요가 없습니다.
- 소스 서버는 파일 읽기에 집중하고 대상 서버는 쓰기를 처리하도록 할 수 있습니다(메타데이터 업데이트와 같은 잠재적인 파일 시스템 IO 충돌이 줄어듭니다).
결점
- 당신은 지금까지의 모든 노력을 포기했습니다
- 고려한 솔루션과 다릅니다.
- 두 시스템 간의 직접 연결이 필요합니다(실제로는 아니지만 SSH 터널을 제공해야 함).
제안된 솔루션
디렉토리 트리의 모든 파일
cd /path/to/top/source/directory rsync -avPR -e ssh . remoteuser@remotehost:/path/to/top/destination/directory
파일에 나열된 파일 이름
cd /path/to/top/source/directory rsync -avPR -e ssh --files-from=/path/to/filelist . remoteuser@remotehost:/path/to/top/destination/directory
두 번째 해결 방법에서는 파일 목록 파일에서 얻은 파일 이름이 대상 파일 시스템에도 적용되므로 소스 디렉터리의 맨 위에 파일 이름을 나열해야 합니다.
이러한 작업을 루트로 수행하는 경우 ssh
루트로 로그인할 수 있도록 원본 서버에서 대상 서버로 인증서를 복사해야 하는 것이 거의 확실합니다.