크기에 따라 디렉토리에 있는 m개의 파일을 n개의 tar 파일에 넣으시겠습니까?

크기에 따라 디렉토리에 있는 m개의 파일을 n개의 tar 파일에 넣으시겠습니까?

tar디렉토리에 있는 더 큰 파일 모음에서 n개의 파일(거의 동일한 크기)을 생성하여 개별적으로 추출할 수 있는지 아는 사람이 있습니까 ?

옵션을 찾고 있는데 안타깝게도 원본 파일을 추출하려면 tar --multi-line생성된 파일이 모두 필요한 것 같습니다 . -ing을 tar사용한 tar다음 split-ing 파일을 사용하면 더욱 그렇습니다.

대략 같은 크기일 필요가 없다면 ls | wc디렉토리에 있는 파일 수를 구한 다음 파일 이름을 동일한 크기의 세트(예: ls | tail -n900| head -n100)로 분할하여 에 전달 한다고 말하고 싶습니다 tar. 아마도 상당한 크기 변화로 끝날 것입니다.

어떤 아이디어가 있나요?

답변1

파일 크기를 확인하는 스크립트를 작성할 수 있습니다.쓰레기통에 배분하세요., 최대 크기를 초과하지 않도록 주의하세요. 최적의 솔루션은 간단하지 않을 수 있지만 그리디 알고리즘은 간단해야 합니다.

tar한 가지 사소한 문제는 파일 내용 외에 차지하는 장부 공간을 고려하는 것입니다. (또한 디렉토리와 특수 파일을 처리하는 방법은 무엇입니까?)

아카이브를 압축하려는 경우 더 큰 문제가 발생합니다. 일반적인 관용구는 파일을 함께 유지 tar하고 별도의 유틸리티를 사용하여 tar 파일을 압축하는 것이므로 파일 경계를 따라 결과 아카이브를 분할하는 것은 그렇게 간단하지 않습니다. 미리 파일의 압축 크기를 알아야 합니다. 파일을 그룹화하기 전에 압축 하면 tar파일의 크기를 알 수 있지만 한 번에 압축하면 공간적 이점을 잃게 됩니다.


사실, awk어느 시점에서는 이 작업을 수행하기 위해 간단한 스크립트를 만들었습니다. 아래 코드는 사용

find dir/ -printf "%s\t%p\n" | sort -n | awk -vmax=$maxsizeinbytes -f pack.awk

(로 출력됩니다 bins.list.NNN. 보장되지 않으며 공백이 포함된 파일 이름에서는 작동하지 않으며 다른 오류가 있을 수 있습니다.)

#!/usr/bin/awk
# pack.awk
{ 
    if ($1 > max) {
        printf "too big (%d, max %d): ", $1, max, $2 > "/dev/stderr";
        exit 1;
    }
    for (x in bins) {
        if (free[x] >= $1) { 
            bins[x] = bins[x] "\n" $2; 
            count[x]++; free[x] -= $1; 
            next 
        }
    }; 
    bins[++i] = $2; free[i] = max - $1; count[i] = 1;
} 
END {
    for (i in bins) {
        printf "bin %d: entries: %d size: %d \n", i, count[i], max - free[i]; 
        print bins[i] > "bins.list." i
    }
}

관련 정보