BusyBox의 tar --exclude는 제외되지 않습니다.

BusyBox의 tar --exclude는 제외되지 않습니다.

dir1/dir2/file스위치를 사용하여 콘텐츠가 포함된 tar 파일을 추출합니다 --exclude dir2. gnu tar는 제외되지만 busybox tar는 제외됩니다.

훌륭하게 작동 --exclude dir1/dir2합니다. 그런데 왜 그럴까요?dir2busybox의 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

관련 정보