パターンが「/」で終わると、GNU tarの「変換」オプションは一貫して動作しません。

パターンが「/」で終わると、GNU tarの「変換」オプションは一貫して動作しません。

tarパス要素を変換するオプションを使用すると、GNUの次の奇妙な動作に直面しました--transform。サブディレクトリ全体を試しtarてパスをそのディレクトリに変換しようとすると、変換は次のようになります。いいえ変換モードが明示的に含まれる場合、ディレクトリ自体だけでなくその内容にも適用されます/

再現するには:

  • ダミーコンテンツを含むディレクトリを作成しますtest-dir
    $ mkdir test-dir
    $ touch test-dir/test{1..50}.txt
    
  • tarディレクトリ名はtest-dir/次のように変更され、スキャン用に変換された名前を印刷するように transformed-dir/指示されます。tar
    $ tar --transform="s,^test-dir/,transformed-dir/," --show-transformed-names -cvf test.tar test-dir
    test-dir/
    transformed-dir/test25.txt
    transformed-dir/test29.txt
    transformed-dir/test47.txt
    ...
    

ご覧のとおり、ディレクトリ自体はいいえ名前の変更はディレクトリ内のすべてのファイルに適用されますが、名前は正しく変更されます。

  • 比較には同じ変換が使用されますが、いいえ末尾/
    $ tar --transform="s,^test-dir,transformed-dir," --show-transformed-names -cvf test2.tar test-dir
    transformed-dir/
    transformed-dir/test25.txt
    transformed-dir/test29.txt
    transformed-dir/test47.txt
    ...
    

今、ディレクトリ自体はい名前を正しく変更してください。

アンカーを省略すると、動作は変更されず、^圧縮するディレクトリがコマンドラインで指定されているかどうかには関係ありません。/

  • /ディレクトリの場合、指定時に問題があるかどうか疑問に思います。みんなファイル名は変更できます。ただし、ファイル全体の名前を変更する変換を指定すると正常に動作します。
    $ tar --transform="s,^test-dir/test29.txt,transformed-dir/file.txt," --show-transformed-names -cvf test3.tar test-dir
    test-dir/
    test-dir/test25.txt
    transformed-dir/file.txt
    test-dir/test47.txt
    ...
    

/それで、追いかけることが実際に問題のようです。これは機能ですか、バグですか、それともこのオプションの範囲/構文を誤解しているのですか?バージョンはtarGNU tar 1.28です。

ベストアンサー1

@muruと@UncleBillyのコメントが指摘したように、ここでは問題はGNU誤解と不幸な結果が混在している可能性がありますtar

  • 「verbose」モード(GNU)で実行すると、ファイルではなく-vディレクトリを参照するすべてのエントリにtar末尾の文字列が追加されます。/
  • しかし、これは/確かに実際のディレクトリ名の一部ではありません。ファイルシステムデータに保存されます。
  • 変換はディレクトリエントリの「実際の」名前で機能するようです。確かに名前の一部ではないので、パターンと一致します。some_name//

したがって、このオプションの一貫性のない動作は、--transform次のために発生します。印刷ディレクトリ名と実際の(内部的に使用される)ディレクトリ名。

@UncleBillyが指摘したように、指定された名前と完全に一致するディレクトリのみを名前変更するには、次の変換ステートメントを使用します。

--transform='s,^path/to/dir\($\|/\),newname\1,'

path/to/dir文字列の終わりアンカーが適用されるディレクトリ$とその内容path/to/dir/fileXXX.yyydir直後のディレクトリ/)の名前のみが変更されます。\1代替テキストの逆参照は、/ディレクトリ内のファイルパス名を変換するときに省略されないことを保証します。

おすすめ記事