파일이 너무 많은 디렉토리가 있습니다.
file.tar.gz
해당 디렉토리의 처음 5,000개 파일을 압축 한 다음 5001 - 10000...등으로 압축하고 싶습니다.
어떻게 해야 하나요?
답변1
ls를 사용하여 이름 목록을 생성하고 머리와 꼬리를 필터링하여 필터링합니다. 다음은 루프에서 이를 수행하는 단일 라이너입니다. 디렉터리에 있는 파일 수를 알아야 합니다(ls | wc -l이 알려줍니다).
for ii in $(seq -w 5000 5000 NUMBER_OF_FILES) ; do echo $ii ; ls | head -n $ii | tail -n 5000 | tar -f ../ARCHIVE_FILE_$ii.tar.gz -czv -T - ; done
대문자로 된 비트를 원하는 것으로 바꾸십시오.
답변2
이 스크립트는 점차적으로 모든 파일을 아카이브에 추가하고 아카이브에 번호를 매깁니다. ARCHIVE_NAME 및 '5000'의 이름을 바꿉니다.
$ COUNT_MOD=0; for i in *; do tar -r -f ARCHIVE_NAME`expr $COUNT_MOD / 5000`.tar $i; ((COUNT_MOD++)) ; done
이 스크립트는 최적화되지 않았으므로 몇 가지 규칙이 있습니다.
- 이 스크립트를 시작할 때 ARCHIVE_NAME#이 존재하지 않아야 합니다. 따라서 오류가 발생하면 'rm ARCHIVE_NAME*'을 수행하세요.
- 디렉토리 항목은 스크립트에 의해 1개 항목으로 처리되지만 'tar'는 처리되지 않습니다. Tar는 디렉토리로 이동하여 모든 파일을 재귀적으로 추가하며 아카이브에 5000개가 넘는 파일이 생길 수 있습니다.
- 압축된 아카이브는 업데이트할 수 없습니다. '-z'를 생략했습니다. 죄송합니다 :-)
답변3
각 5000개의 파일 이름을 나열하는 파일 세트를 빌드하고 이를 tar에 대한 -T 인수와 함께 사용할 수 있습니다. 다음과 같이 작동할 수 있습니다.
ls -1 | split -l 5000 - tarlist
count=0
for f in tarlist*
do
tar -czf save.$count.tar.gz -T $f
count=`expr $count + 1`
done