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