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に少なくとも1つの他の要素が必要です。そして失敗する他の特別なケースもあるかもしれません。

-e '/.*/.'tar tfコマンドで生成される要素の数を制限するために追加されました。

おすすめ記事