tarファイルを作成しようとしています。 tarredが必要なフォルダが2つあります。私の質問を明確にしましょう。
folder 1. /temp1
folder 2. /temp1
今私のtar出力は次のようになりたいと思います。解凍すると、次のような結果が得られます。
/temp1/* (stuff of temp1)
/temp1/temp2/* (temp2 and subdirectories inside temp1).
次に、temp2をtemp1にコピーして圧縮します。誰かが私がこれらのコンテンツをコピーする必要がない方法でこれを行うように提案できますか?途中でプロセスを終了するのと同じように、temp2の一部の内容をtemp1に残します。
答え1
temp2をtemp1にSymlinkにリンクし、tarに-h
orオプションを使用して--dereference
シンボリックリンクを逆参照(続行)するように指示します。
例えば
cd temp1
ln -s ../temp2/ .
cd ..
tar cvz -h -f example.tar.gz ./temp1
rm -f temp1/temp2
これにより、ディレクトリ(たとえば)の./temp2
下にtarアーカイブが作成されます。./temp1
./temp1/temp2
-h
このオプションがGNU拡張であるかどうか覚えていません。 GNUを使用していない場合は、tar
使用する前に慎重にテストしてください。
temp1の修正タイムスタンプに興味がある場合は、以下を使用してくださいtouch -r
。
touch -r temp1 temp1-modtime
cd temp1
ln -s ../temp2/ .
cd ..
touch -r temp1-modtime temp1
tar cvz -h -f example.tar.gz ./temp1
rm -f temp1/temp2
touch -r temp1-modtime temp1
rm -f temp1-modtime
答え2
sedがパス名をアーカイブとして処理している間に、検索および置換するtarの変換オプションを使用してこれを実行できます。
私の考えでは、あなたが望むものは次のとおりです。
tar -cf output.tar --transform 's,^temp2,temp1/temp2,' temp1 temp2
これは、で始まるすべてのパスと一致し、でtemp2
書き直されますtemp1/temp2
。で始まるすべてのパスは一致しないため、変更されませんtemp1
。
答え3
いくつかのヒントでtar拡張を使用してください。このような?
$ mkdir temp3; mkdir temp3/temp1 # create another, empty temp1 dir
$ ln temp2 temp3/temp1/temp2 # link temp2 into fake temp1
それから...
$ tar cf example.tar temp1 # 1st part of archive without temp2
$ cd temp3
$ tar rf ../example.tar temp1 # append temp2 as subfolder of temp1 to archive
ハードリンクを使用すると、一時ディレクトリのシンボリックリンクをシンボリックリンクとして扱うことができます。したがって、-hは必要ありません。おそらくそれは将来あなたを問題から守ってくれるでしょう。
--transform などの追加コマンドを使用して GNU tar 拡張を表示することもできます。また見なさい:http://www.linuxquestions.org/questions/linux-newbie-8/tar-subdirectory-question-821074/