
tarとxzを使用してディレクトリをバックアップしようとすると問題があります。ファイルを開くと、すべてのファイルとディレクトリが./
. で始まります。そんなことが起きたくありません。
file.tar.xz
|---- ./directory
|---- ./file1.txt
|---- ./file2.txt
|---- ./file3.txt
これは私が使用するコードです:
tar -cf - -C $dir --absolute-names . | xz -c > $output/$name.$date.txz
これを防ぐために何を変更する必要がありますか?
答え1
名前に特殊文字を含む低レベルのファイルまたはディレクトリを処理する必要がない場合$dir
:
tar -cf - -C "$dir" --absolute-names $(ls -A "$dir") | xz -c > "$output/$name.$date.txz"
これにより、コンテンツが一覧表示され$dir
、tar
コンテンツをアーカイブするように求められます。代わりに、.
コンテンツは$dir
アーカイブのルートに表示されます。
/
ルートパスから始まらないので、GNU固有の特定の項目は必要ありません--absolute-names
。
tar -cf - -C "$dir" $(ls -A "$dir") | xz -c > "$output/$name.$date.txz"
答え2
使用pax
(保管用POSIXコマンド):
(cd -P -- "$dir" && pax -w's|^\./||' .) | xz > file.tar.xz
ただし、GNUと同様に、tar
置換--transform
はs|^\./||
シンボリックリンクターゲットでも機能するため、foo -> ./bar
現在のディレクトリにシンボリックリンクがある場合foo -> bar
。
GNUを使用するときにtar
フラグを渡すことでこれを回避できますS
。
tar --transform='s|^\./||S' -cf - . | xz > file.tar.xz
標準pax
コマンドには同等のコマンドはありません。
答え3
まず、使用法で判断すると、--absolute-names
GNU Tarオプションを使用しても問題ありません。この場合、次のパターンに従って解決策は簡単です。
tar -cf archive.tar --transform s/..//S .
引数は、アーカイブに保存される前に各名前に適用されるパターン--transform
です。sed
ドットとスラッシュという最初の2文字を削除しました。このS
フラグはいいえシンボリックリンクのターゲットを置き換えます。
ディレクトリに.
アーカイブに入る必要がある隠し項目(次から始まる項目)が含まれていない場合は、cd
アーカイブに入ることができ、次のパターンを使用できます*
。
( cd "$dir" && tar -cf - -- * ) | xz -c > "$output/$name.$date.txz"
このディレクトリの変更をシェルサブプロセスに制限するために括弧を使用します。パイプの右側の要素はxz ...
元のディレクトリで実行されるため、$output
相対的な場合は期待どおりに機能します。失敗した場合は&&
実行されないように使用します。tar
cd
複数の名前がある場合は、次のよう.
に明示的に一覧表示できますtar ... * .important1 .important2
。
GNU固有のオプションについて言えば、このオプションの使命はパスの先頭(そうでなければ削除される)を保存する--absolute-names
ことですが、ここでは発生しないので削除しました。/
これに意味がある場合は、次のことを行う必要があります。
tar -cf whole-fs.tar --absolute-names /
tar -cf etc-dir.tar --absolute-names /etc
答え4
基本的に、不要な行間を削除する最初の無料tar
実装をどのように使用できますか?star
./
星は以下から得ることができます:
https://sourceforge.net/projects/s-tar/
開発スナップショットは次の場所にあります。
http://schilytools.sourceforge.net/
Starはもともと1982年に作成され、長年にわたってすべてのLinuxディストリビューションの一部でした。その後、gtar
gtarに存在しないかバグのある方法で実装されたLinux関連の機能が含まれているにもかかわらず、不明な理由でほとんどのディストリビューションからそれらを削除しました。他のtar実装よりも問題が少ないため、多くのシステム管理者がスターを取得してコンパイルすることを理解しています。
実際、libfind
star は 2004 年から含まれており、他の tar 実装が 1 つのステップで実行できない、またはまったく実行できないタスクを実行できるようにします。組み込みの機能により、find
多くの作業が簡単になります。
他のtar実装の多くの機能はstarで最初に登場し、後で他のtar実装に含まれていました。現在、さまざまな tar 実装で使用されている POSIX.1-2001 標準に基づくほとんどのアーカイブ形式拡張は star からインポートされました。