「./」で始まる.tarコンテンツを使用しないでください。

「./」で始まる.tarコンテンツを使用しないでください。

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"

これにより、コンテンツが一覧表示され$dirtarコンテンツをアーカイブするように求められます。代わりに、.コンテンツは$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置換--transforms|^\./||シンボリックリンクターゲットでも機能するため、foo -> ./bar現在のディレクトリにシンボリックリンクがある場合foo -> bar

GNUを使用するときにtarフラグを渡すことでこれを回避できますS

tar --transform='s|^\./||S' -cf - . | xz > file.tar.xz

標準paxコマンドには同等のコマンドはありません。

答え3

まず、使用法で判断すると、--absolute-namesGNU 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相対的な場合は期待どおりに機能します。失敗した場合は&&実行されないように使用します。tarcd

複数の名前がある場合は、次のよう.に明示的に一覧表示できます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ディストリビューションの一部でした。その後、gtargtarに存在しないかバグのある方法で実装されたLinux関連の機能が含まれているにもかかわらず、不明な理由でほとんどのディストリビューションからそれらを削除しました。他のtar実装よりも問題が少ないため、多くのシステム管理者がスターを取得してコンパイルすることを理解しています。

実際、libfindstar は 2004 年から含まれており、他の tar 実装が 1 つのステップで実行できない、またはまったく実行できないタスクを実行できるようにします。組み込みの機能により、find多くの作業が簡単になります。

他のtar実装の多くの機能はstarで最初に登場し、後で他のtar実装に含まれていました。現在、さまざまな tar 実装で使用されている POSIX.1-2001 標準に基づくほとんどのアーカイブ形式拡張は star からインポートされました。

関連情報