dir1/dir2/file
스위치를 사용하여 콘텐츠가 포함된 tar 파일을 추출합니다 --exclude dir2
. gnu tar는 제외되지만 busybox tar는 제외됩니다.
훌륭하게 작동 --exclude dir1/dir2
합니다. 그런데 왜 그럴까요?dir2
busybox의 tar 이름을 딴 디렉토리를 제외하는 방법이 있습니까 ?
test.sh는 다음과 같습니다.
# busybox 1.36 tested on debian:11 livecd and fedora:37 livecd
busybox
# clear old files
rm -rf bb-test
# prepair for testing
mkdir -p bb-test/dir1/dir2
cd bb-test
echo file3-content > dir1/dir2/file3
tar -cf a.tar dir1
mkdir out-coreut-2 out-busybo-2
# let's try!
tar -xf a.tar -C out-coreut-2 --exclude dir2
busybox tar -xf a.tar -C out-busybo-2 --exclude dir2
# see difference
echo "" && tree out-coreut-2
echo "" && tree out-busybo-2
cd ..
내 컴퓨터에서 출력:
BusyBox v1.36.0 (2023-01-10 00:00:00 UTC) multi-call binary.
...
out-coreut-2
└── dir1
2 directories, 0 files
out-busybo-2
└── dir1
└── dir2
└── file3
3 directories, 1 file
답변1
--exclude dir1/dir2를 사용하면 문제가 없지만 왜 그럴까요?
busybox tar에는 옵션이 없습니다 --exclude
. busybox(1)을 참조하십시오. 그래서 그것은 작동할 수도 없고 작동하지도 않을 것입니다. Debian 11 설치 시 --exclude
다음을 사용하면 다음과 같은 오류 메시지가 나타납니다.
tar: unrecognized option '--exclude'
BusyBox v1.30.1 (Debian 1:1.30.1-6+b3) multi-call binary.
오류 메시지 외에 코드 출력은 다음과 같습니다.
out-coreut-2
└── dir1
1 directory, 0 files
out-busybo-2
0 directories, 0 files
하지만 잘못된 입력으로 인해 다음과 같은 결과가 나올 수 있다는 점에 유의하세요.
busybox tar xf a.tar -C out-busybo-2 exclude dir1/dir2
dir1/dir2
이를 위해서는 합계를 추출해야 합니다 exclude
. 제외 항목이 아카이브에 존재하지 않고 오류 메시지가 표시되지만 dir1/dir2가 아카이브에 존재하여 추출되었습니다.
busybox의 tar를 사용하여 dir2라는 디렉터리를 제외할 수 있는 방법이 있습니까?
아니요, 간단한 명령은 아닙니다.
busybox rm -rf dir1/dir2
파일을 추출하려는 장치에 충분한 공간이 있으면 추출 후에 이 작업을 수행 할 수 있습니다 .
dir1 디렉토리에 다른 것이 있으면 결국 아카이브를 나열하고 필터링한 ^dir1/dir2
다음 결과를 추출할 파일 목록으로 사용할 수 있습니다. 이 같은
# prepare data
rm -rf dir1
mkdir -p dir1/dir2 dir1/dir3
: >dir1/file1
: >dir1/dir2/file2
: >dir1/dir3/file3
busybox tar cf b.tar dir1
rm -rf dir1
# extract everything but dir1/dir2
busybox rm -rf out-busybo-2
busybox mkdir out-busybo-2
busybox tar xC out-busybo-2 -f b.tar $(
busybox tar tf b.tar |
busybox grep -ve ^dir1/dir2/ -e '^dir1/$' -e '/.*/.'
)
결과:
out-busybo-2/
└── dir1
├── dir3
│ └── file3
└── file1
그러나 아카이브의 파일 이름에 공백이 있으면 작동하지 않습니다. 또한 이것이 작동하려면 dir1에 최소한 하나의 다른 요소가 있어야 합니다. 그리고 실패하는 다른 특수한 경우도 있을 수 있습니다.
-e '/.*/.'
tar tf 명령으로 생성되는 요소 수를 제한하기 위해 추가되었습니다.
답변2
그러한 "busybox tar"는 없습니다. tar
다수의 모드, 옵션 등을 포함하는 바이너리 파일입니다. Busybox는 예를 들어 다른 바이너리인 것처럼 가장할 수 있는 바이너리입니다 tar
. 이는 단지 공간을 절약하기 위해 임베디드 시스템이나 유사한 시스템에서 자주 사용됩니다. 범용 바이너리로서 대체하는 원본 바이너리에서 사용할 수 있는 제한된 기능 세트만 포함되어 있습니다.
문제는 다음과 같이 작동하는 것 같습니다.
busybox tar -xf a.tar -C out-busybo-2 --exclude */dir2
결과:
out-coreut-2
└── dir1
1 directory, 0 files
out-busybo-2
└── dir1
1 directory, 0 files