- 締切済み
tarでディレクトリのみをアーカイブしたい
【質問】 Solaris8 純正のtarコマンドで、ファイルを除いてディレクトリのみをアーカイブする良い方法を模索しています。 【背景】 ディレクトリ構成をtarで抽出し、別のマシンで解凍する(/export/homeなど)際に、配下のファイルサイズが大きく時間がかかるため、抽出の際にファイルを除外しておきたい 【前提】 tarでアーカイブする際、ディレクトリを指定すると配下のファイルも再帰的にアーカイブされてしまう。 【詳細】 例えば、以下のようなディレクトリ構造のとき、 AAA/ AAA/aaa/ AAA/aaa/hoge.c BBB/ BBB/foo.txt ディレクトリのみをtarアーカイブして、 AAA/ AAA/aaa/ BBB/ という内容のtarアーカイブを作成するとき、私は以下のようなやり方をしています。 A.全抽出→解凍→ファイル消し→再抽出 # tar cf - AAA BBB | (cd /tmp/work; tar xvf -) # cd /tmp/work # find . -type f -exec rm {} \; # tar cvf /dev/rmt/0 AAA BBB B.除外リスト作成→除外リスト指定で抽出 # find AAA BBB -type f > exclude-list # tar cvfX /dev/rmt/0 exclude-list AAA BBB どちらも結果的にはディレクトリのみ抽出できるので問題はないのですが、ちょっと手間がかかります。コマンドライン1行でできる良い方法があれば教えて下さい。 # そもそも【前提】が私の思い込みかもしれないので、 # 「違うよ」という指摘があればお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- odacle
- ベストアンサー率0% (0/2)
お望みのことはtarではできませんがcpioを使えば簡単にできます。 例えば、以下のようなファイルとディレクトリがある場合 % find ./a a a/b a/b/c a/b/i.txt a/b/j.txt a/x.txt a/y.txt アーカイブの作成 % find a/ -type d | cpio -ov > a.cpio a/ a/b a/b/c 1 block アーカイブの展開 % cpio -ivd < a.cpio a a/b a/b/c 1 block といった感じです。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
ディレクトリの構成だけを移したいのだったら tarにこだわらずとも ディレクトリ構成リストを作るスクリプトと リストからmkdirするスクリプトを 作ればいいような気がするのですが。
お礼
ご提案いただいたやり方、私もよく使います。 (ディレクトリ、パーミッション、オーナー、グループを指定するディレクトリ構成リストを作って、そのリストからmkdir/chown/chmodするスクリプトを使っています) 作るだけが目的の場合はスクリプトでよいのですが、 バックアップ目的で(作成日時の記録保存)DAT保管し、別環境で「○月×日の状態のディレクトリ構成を戻し」て再現試験を行う、というような場合にtarを使うので、もうちょっとラクな方法はないかな、と考えています。 ご回答ありがとうございました。
最近あまりUNIXのコマンドラインを扱っていないのでtarの仕様も良く覚えていないのですが... tarが個別のファイルを固められるとして、こんな感じ(雰囲気)でできないでしょうか? tar cvfx `ls -F <directory> | grep -v "*\/"` 分かるかた、フォローをお願いします。 # ls -Fの結果がどう評価されるかが心配です。 今の方法でできるのでしたら、それをシェルスクリプトにしてしまえばいいような気がします。
お礼
ご回答ありがとうございます。 tar cvf XXXXX の XXXXX の部分でディレクトリを指定した場合に、ディレクトリの中身のファイルも一緒にアーカイブされてしまう、という仕様に対して、ディレクトリのみをアーカイブできないか、というのが今回模索している点です。 ですので、`ls -F <directory> | grep -v "*\/"` の結果がディレクトリであれ、ファイルであれ、結果としてはファイルもアーカイブされてしまいます。 やはりtarの仕様上、無理なのでしょうね。 なお、cとxのオプションは一緒に扱えません。
お礼
やはりtarでは無理なんですね。 cpioは参考になりました。ありがとうございます。