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 ...
/
それで、追いかけることが実際に問題のようです。これは機能ですか、バグですか、それともこのオプションの範囲/構文を誤解しているのですか?バージョンはtar
GNU 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.yyy
(dir
直後のディレクトリ/
)の名前のみが変更されます。\1
代替テキストの逆参照は、/
ディレクトリ内のファイルパス名を変換するときに省略されないことを保証します。