![busybox tar 또는 대용량 파일을 여러 개의 작은 파일로 분할](https://linux55.com/image/63833/busybox%20tar%20%EB%98%90%EB%8A%94%20%EB%8C%80%EC%9A%A9%EB%9F%89%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%97%AC%EB%9F%AC%20%EA%B0%9C%EC%9D%98%20%EC%9E%91%EC%9D%80%20%ED%8C%8C%EC%9D%BC%EB%A1%9C%20%EB%B6%84%ED%95%A0.png)
저는 at91sam9g20에서 Linux 버전 3.4.8을 실행하고 있습니다.
대용량 레코드를 여러 개의 파일로 분할하고 싶습니다. 다양한 방법을 시도했지만 아무 것도 작동하지 않는 것 같습니다.
tar -c -M --tape-length=102400 --file=disk1.tar mytest.tar.g
z
tar: invalid option -- M
BusyBox v1.20.2 (2012-09-24 16:21:25 CEST) multi-call binary.
Usage: tar -[cxthvO] [-X FILE] [-T FILE] [-f TARFILE] [-C DIR] [FILE]...
Create, extract, or list files from a tar file
Operation:
c Create
x Extract
t List
f Name of TARFILE ('-' for stdin/out)
C Change to DIR before operation
v Verbose
O Extract to stdout
h Follow symlinks
exclude File to exclude
X File with names to exclude
T File with names to include
busybox에는 특정 매개변수를 허용하지 않는 간단한 tar 버전이 있는 것 같습니다.
분할하려고 하면 다음과 같은 결과가 나타납니다.
/:# 분할 -sh: 분할: 찾을 수 없음
busybox 명령 세트를 사용하여 대용량 파일을 여러 파일로 분할할 수 있는 방법이 있습니까?
Currently defined functions:
[, [[, addgroup, adduser, ar, arping, ash, awk, basename, blkid,
bunzip2, bzcat, cat, catv, chattr, chgrp, chmod, chown, chroot, chrt,
chvt, cksum, clear, cmp, cp, cpio, crond, crontab, cut, date, dc, dd,
deallocvt, delgroup, deluser, devmem, df, diff, dirname, dmesg, dnsd,
dnsdomainname, dos2unix, du, dumpkmap, echo, egrep, eject, env,
ether-wake, expr, false, fdflush, fdformat, fgrep, find, fold, free,
freeramdisk, fsck, fuser, getopt, getty, grep, gunzip, gzip, halt,
hdparm, head, hexdump, hostid, hostname, hwclock, id, ifconfig, ifdown,
ifup, inetd, init, insmod, install, ip, ipaddr, ipcrm, ipcs, iplink,
iproute, iprule, iptunnel, kill, killall, killall5, klogd, last, less,
linux32, linux64, linuxrc, ln, loadfont, loadkmap, logger, login,
logname, losetup, ls, lsattr, lsmod, lsof, lspci, lsusb, lzcat, lzma,
makedevs, md5sum, mdev, mesg, microcom, mkdir, mkfifo, mknod, mkswap,
mktemp, modprobe, more, mount, mountpoint, mt, mv, nameif, netstat,
nice, nohup, nslookup, od, openvt, passwd, patch, pidof, ping,
pipe_progress, pivot_root, poweroff, printenv, printf, ps, pwd, rdate,
readlink, readprofile, realpath, reboot, renice, reset, resize, rm,
rmdir, rmmod, route, run-parts, runlevel, sed, seq, setarch,
setconsole, setkeycodes, setlogcons, setserial, setsid, sh, sha1sum,
sha256sum, sha512sum, sleep, sort, start-stop-daemon, strings, stty,
su, sulogin, swapoff, swapon, switch_root, sync, sysctl, syslogd, tail,
tar, tee, telnet, test, tftp, time, top, touch, tr, traceroute, true,
tty, udhcpc, umount, uname, uniq, unix2dos, unlzma, unxz, unzip,
uptime, usleep, uudecode, uuencode, vconfig, vi, vlock, watch,
watchdog, wc, wget, which, who, whoami, xargs, xz, xzcat, yes, zcat
답변1
, 및 매개변수 dd
와 함께 busybox 애플릿을 사용하여 대용량 파일을 청크로 분할할 수 있습니다.bs
count
skip
dd
맨페이지 섹션 busybox
:
dd [if=FILE] [of=FILE] [ibs=N] [obs=N] [bs=N] [count=N] [skip=N]
[seek=N] [conv=notrunc|noerror|sync| 동기화]Copy a file with converting and formatting if=FILE Read from FILE instead of stdin of=FILE Write to FILE instead of stdout bs=N Read and write N bytes at a time ibs=N Read N bytes at a time obs=N Write N bytes at a time count=N Copy only N input blocks skip=N Skip N input blocks seek=N Skip N output blocks conv=notrunc Don't truncate output file conv=noerror Continue after read errors conv=sync Pad blocks with zeros conv=fsync Physically write data out before finishing
따라서 기본적으로 다음과 같은 작업을 수행합니다.
$ dd if=bigfile of=part.0 bs=1024 count=1024 skip=0
$ dd if=bigfile of=part.1 bs=1024 count=1024 skip=1024
$ dd if=bigfile of=part.2 bs=1024 count=1024 skip=2048
각 part.X
파일 dd
쓰기 에 대해 입력 파일의 첫 번째 바이트를 count * bs bytes
무시합니다 .skip
매우 기본적인 단일 라이너( sed
비지박스 xargs
와 dd
애플릿 결합)는 다음과 같습니다.
seq 0 19 | xargs -n1 sh -c 'dd if=bigfile of=part.$0 bs=1024 count=1024 skip=$(expr $0 \* 1024)'
part.X
최대 20개 크기의 파일을 생성합니다 1048576 bytes
.
분할 예 bigfile
:
$ ls -l
total 2940
-rw-rw-r-- 1 user user 3000000 Apr 27 13:21 bigfile
$ seq 0 20 | xargs -n1 sh -c 'dd if=bigfile of=part.$0 bs=1024 count=1024 skip=$(expr $0 \* 1024)'
1024+0 records in
1024+0 records out
1024+0 records in
1024+0 records out
881+1 records in
881+1 records out
0+0 records in
0+0 records out
[...]
$ ls -l
total 5968
-rw-rw-r-- 1 user user 3000000 Apr 27 13:21 bigfile
-rw-rw-r-- 1 user user 1048576 Apr 27 13:43 part.0
-rw-rw-r-- 1 user user 1048576 Apr 27 13:43 part.1
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.10
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.11
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.12
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.13
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.14
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.15
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.16
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.17
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.18
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.19
-rw-rw-r-- 1 user user 902848 Apr 27 13:43 part.2
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.3
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.4
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.5
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.6
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.7
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.8
-rw-rw-r-- 1 user user 0 Apr 27 13:43 part.9
복원 cat
(또는 dd
매개변수를 다시 사용 seek
)을 쉽게 수행할 수 있습니다. 0바이트 파일은 건너뛸 수 있습니다.
$ cat part.0 part.1 part.2 > bigfile.res
$ diff bigfile bigfile.res
필요에 따라 seq
대용량 파일의 특정 크기를 사용 및 계산하지 말고 모든 작업을 쉘 스크립트에서 수행하면 됩니다.
답변2
ARM 기반 마이크로컨트롤러용으로 정적으로 연결된 비지박스 바이너리를 다운로드할 수 있다고 생각합니다.http://www.busybox.net/downloads/binaries/latest/
내가 아는 한, 사용 가능한 모든 바이너리에는 여기에 설명된 모든 유틸리티가 포함되어 있습니다.http://www.busybox.net/downloads/BusyBox.html
따라서 매우 간단한 방법으로 분할 유틸리티를 사용할 수 있습니다.