• ベストアンサー

フィルタをかけて圧縮

test フォルダの中身で、特定のディレクトリ・ファイルを除いた全てのをファイル群を test.tar.gz に圧縮したいのですが pipe等を使ったりして一発で圧縮するよい方法はないでしょうか? (例) testディレクトリの圧縮。ただし以下のファイルを除く(*は任意のファイル)。 test/zyogai/* 知恵をお貸しください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

GNU tar で bzip2 で圧縮された tar ファイルを作る場合はこれでできます。(GNU tar は有名な Linux ディストリビューションならデフォルトでインストールされている tar コマンドです)。 tar c --exclude test/zyogai -jf test.tar.gz2 test 全部長い型式のオプションで書くとこうです。 tar --create --exclude='test/zyogai' --bzip2 --file test.tar.gz2 test test/zyogai/ というディレクトリは含めるけどその下のファイルは含めたくないという場合は --exclude='test/zyogai/*' にすればできます。 何らかの事情で tar コマンドが GNU tar ではなく、--exclude に該当するオプションがないという場合は find を使ってファイル名を抜き出して除外したファイル名のリストを作って指定すればいいと思います。 例 tar cf - `find test -type f -print | grep -v '^test/zyogai/'` | bzip2 >test.tar.bz2 但し GNU tar の -T オプションに該当するオプションがあるのならこんな風にも書けます。(-T - の部分は標準入力からファイル名を読むという意味です。中間ファイルを作って2段階でやってもいいです)。 find test -type f -print | grep -v '^test/zyogai/' | tar c -T - -f - | bzip2 >test.tar.gz2

参考URL:
http://www.linux.or.jp/JM/html/GNU_tar/man1/tar.1.html
全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • __orz
  • ベストアンサー率44% (12/27)
回答No.1

% ls test | grep -v 'test/zyogai/' | xargs tar czf test.tar.gz とかでどうでしょうか。 # 微調整が必要かもしれません % ls test | grep -v 'test/zyogai/' で出力を確認してみて、良さそうなら、大丈夫だと思いますが。 余談ですが、 zsh とか使っていると、もう少し違う方法もありますが。 そういうの興味があれば、zshお勧めです。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ◆圧縮&伸張コマンド

    いつもお世話になっています。 Linux初心者です。 Linuxコマンドでの圧縮系はtar + gzipが一般的なのでしょうか? (他に手軽&圧縮率が高いのがあればご教授下さい) 【実行したい事】 定期的に動いているcronがあります。wgetで取得したファイル群(フォルダ含め)を取得後に圧縮をかけたい。で、次回のwgetをかける前に今度はファイル群(フォルダ含め)を元に戻したい。 cron ⇒ 伸張&展開(ファイル群) ⇒ wget ⇒ 圧縮(ファイル群。元ファイル群は削除) ⇒ cron お手数ですが、解凍 & 圧縮のサンプルコマンドをご教授下さるとありがたいです。 ↓↓↓こんな感じで問題ないのでしょうか? 伸張&展開: tar xvzf ***.tar.gz 圧縮&アーカイブファイル:tar cvzf ***.tar.gz dir(各フォルダ&ファイル群) wgetで-nc(取得済みは取らない)を使用しているので、ちゃんと元に戻って欲しい(当たり前ですが。。。)のとファイル群の容量が大きいので手軽に圧縮させたい。

  • tarコマンドの圧縮

    こんにちは。 3ファイルある、ディレクトリ(test)を、tarコマンドでまとめて、 gzipコマンドにて圧縮しました。 そのあと、gzcatコマンドにて、展開して結果をファイルに おとして見たところ、余計なものが付加されます。 見たところ、ディレクトリ名が付加されている感じに、なっており、 出さないようにする方法があれば、教えてください。 【構成】 OS:HP-UX  ディレクトリ:test ファイル:test1(中身は,yuuuuuu 1行のみ) test2(中身は,xxxxxxx 1行のみ) test3(中身は,zzzzzzz 1行のみ) 【圧縮】  1・tarコマンド (tar cvf test.tar test/) 2.gzipコマンド(gzip test.tar) 【解凍】  1.gzcatコマンド(gzcat test.tar.gz > list) 【結果】 1.catコマンド(cat list) test/0040750000000000000000000104357767601770ustar00rootsys0000test/test1000644100000000000000013104364453400126510ustar00rootsys00000000000yuuuuuu test/test200644000000013104364453400126510ustar00rootsys000000000xxxxxxx test/test300644000000013104364453400126510ustar00rootsys000000000zzzzzzz

  • tar.gz圧縮のファイルサイズについて

    レンタルサーバCPIにて、 公開ディレクトのWebデータを圧縮してバックアップをとりたいと思い、 tar.gz圧縮のスクリプトを書いてcronで自動実行(1日1回)させています。 生成されたデータをみると、 公開ディレクトリのファイル数やフォルダ数は同じにも関わらず、 tar.gzの圧縮ファイルのファイルサイズが毎回異なっているのですがこれはtar.gzの仕様でしょうか? コマンドは下記となります。 tar -czf /usr/home/*****/webdata.tar.gz /usr/home/*****/html/; お分かりの方、ご教示頂ければと思います。 どうぞよろしくお願いいたします。

  • tar zcf  で Argument list too long のエラーが出る

    aaa下の中身を圧縮して test.tar.gz を作り、これを bbb下に移動させるのを 以下のようにshで行っています。 #!/bin/bash cd /aaa tar zcf test.tar.gz * mv test.tar.gz /bbb これを、なにか圧縮コマンドのオプションを使って 圧縮元と圧縮ファイル作成先を指定して、1行で済ますことは出来ますか? tar zcf /bbb/test.tar.gz /aaa/*   を試してみましたが、 -bash: /bin/tar: Argument list too long と出てしまいます。ご教授宜しく御願いいたします。

  • /から圧縮したい

    ソラリスが動いているサーバーのデータのバックアップをしようと思っています。 テープデバイス以外の方法をご存知でしたら 教えていただきたいんです。 今やろうとしているのが tar.gzへの圧縮なんですが まとめて圧縮できないかと悩んでおります。 全データを一つにまとめて圧縮なんてできるんでしょうか? コマンドだとファイル名をbackup.tar.gzにするとして tar cvfz backup.tar.gz /  になるのですか?? よろしくお願いします。

  • tar圧縮ファイルが作成できず困っています。

    tarとgzipをパイプでつなげて使用すると、tar圧縮ファイルが正常に 作成できず困っています。(Solaris) *やりたいこと* ファイル一覧test.txtに記載されているファイルを一度に tar圧縮したい。(tar・gzip別々でなく) *コマンドライン* # tar cvfp - -I test.txt | gzip -c > test.tar.gz a aaa.txt 1K a bbb.txt 1K a ccc.txt 1K # ls -l test.tar.gz(←とりあえずファイルは作られている) -rw-r--r-- 1 root other 33235 5月 12日 10:03 test.tar.gz # gunzip test.tar.gz(←unzipもできる) gunzip: /usr/bin/gzip has 2 other links -- unchanged # ls -l test.tar -rw-r--r-- 1 root other 64076 5月 12日 10:03 test.tar # file test.tar(←この時点でおかしい。file種別がアーカイブじゃない) test.tar: ELF 32-ビット MSB 実行可能 SPARC バージョン 1[動的にリンクされています][取り除かれています] # tar xvfp test.tar(←エラーになる) tar: ディレクトリの検査合計エラーです。 # /bin/tar xvfp test.tar(←違うtarでやってみるとエラーがでる) tar: This does not look like a tar archive tar: Skipping to next header tar: Archive contains obsolescent base-64 headers tar: Read 2636 bytes from test.tar tar: Error exit delayed from previous errors 上記のような現象になって困っています。パイプ以降をcompressに するとふつうにいけるので、gzipがおかしいような気もするのですが。 サイトを検索するとみなさんGNUのgtarをお勧めしているようですが そちらもだめでした。 どなたか解決策をご存知の方がいたらご教授願います。

  • tarで圧縮したファイルの解凍時の保存先指定

    こんにちは、tarについてご教授ください。 tar czvf /home/hoge/test.tar.gz /home/hoge/testdir ↑の様に圧縮したとします。 これを同じ場所に解凍したいのです。 /home/hoge/test.tar.gz を /home/hoge/ のディレクトリの中から下記の様に解凍します。 tar zxvf /home/hoge/test.tar.gz すると、/home/hoge/home/hoge/testdir/ に解凍されてしまいます。 試しに tar zxvf /home/hoge/test.tar.gz / と言う感じに指定できたら、問題解決なんですが・・・これはできませんでした。 /に移動してからコマンドを発行ということも訳あってできません。 というのもPHPのプログラム上からsystemコマンドで圧縮と解凍をしているのですが、 解凍すると、PHPがあるディレクトリからの相対パスに解凍されてしまいます。 指定した場所に解凍するということはできませんでしょうか? tar --help でみてみたのですが、それらしきオプションは探せませんでした。 zipはまだ使ったことありませんが、こちらを使った方がサーバーへの負荷や扱いやすさでは上なのでしょうか? ご教授お願い致します。

  • cronからtarで圧縮しようとすると、途中で終わってしまいます

    サーバーはCentOS 5.3です。 以下はroot権限での話です。 コマンドラインで /bin/tar cvzf /home/myhome/backup/var_backup.tar.gz /var と打ち、実行すると正しく圧縮されたファイルが出来上がります。 解凍してみても問題ありません。 大きさは700MBくらいになります。 ところが同じコマンドをCronにセットして実行すると、ファイルはできるのですが 254K というとても小さなファイルが出来上がって終わってしまいます。 解凍してみるととても中途半端なところで圧縮が終わっているみたいです。 5 0 * * * /bin/tar cvzf /home/myhome/backup/var_backup.tar.gz /var のように書いています。 rootのcrontabなので権限の問題ということも無いと思うのですが。 別のディレクトリでも試してみたのですが同じ結果でした。 別のサーバーで同じくCentOS5.3を使っていて、同じことをやっているのですが そちらはうまく行っているのです。 どなたか解決策などご存知でしたら教えてください。 同じような質問が過去にもあったようなのですが、未解決で終わっていました。

  • 時間毎のディレクトリ圧縮&ローテート方法を知りたい

    CentOSにて、特定ディレクトリの圧縮を行い、一定期間バックアップとして保持したいのですが、 うまいことシェルが組めずに困っています。 理想の動作としては、下記のような感じです。 ---------------------------------- ・1時間に1回、特定ディレクトリを圧縮 ・圧縮後のファイルは48時間分サーバに保存 ・48時間を超えたものは自動で削除 ---------------------------------- 現在はシェルとcronを使用し、下記を毎時10分に実行しております。 バックアップの役割は果たしているのですが、手動で削除が必要な状況です。 ---------------------------------- date=`/bin/date +%y%m%d%H` tar cfz $date.tar.gz /home/****/ ---------------------------------- 識者のみなさま、ご教示くださいませ。

  • 特定の名前のディレクトリーを検索して、それぞれの中身を圧縮して、それぞれ別名で保存したいのですが・

    HELLO という名前のディレクトリー(複数)を検索し、 その中身を、それぞれ tar.gz して、別ディレクトリーに保存する、 という一連の流れを sh で実現したいと思っています。 HELLOという名前のディレクトリーは、必ず以下のような形で /root/data/site# の下にあります。 /root/data/site4/bbb/ccc/HELLO /root/data/site9/eee/HELLO /root/data/site20/HELLO それぞれの中身が以下のようになっていた場合、 /root/data/site4/bbb/ccc/HELLO/1.txt /root/data/site4/bbb/ccc/HELLO/2.txt /root/data/site4/bbb/ccc/HELLO/3.txt /root/data/site9/eee/HELLO/4.txt /root/data/site9/eee/HELLO/5.txt /root/data/site9/eee/HELLO/6.txt /root/data/site20/HELLO/7.txt /root/data/site20/HELLO/8.txt それぞれの中身を /home/backup というディレクトリー内に、site# を冠した名前で、 site4.tar.gz site9.tar.gz site20.tar.gz のように保存したいです。 *たとえばsite4.tar.gz は、解凍すると、1.txt 2.txt 3.txt という 3つのファイルが出来るようなtarballです。 find /root/data -name "HELLO" でHELLOディレクトリーを検索するとして、それが複数見つかったうえ、それぞれの中身を、 パスに含まれるsite#を冠したtarballにするあたりの処理が どうしてもうまく記述できません。 site#を冠したtarballにするのが無理なら、単純に、 1.tar.gz  2.tar.gz  3.tar.gz というような 名前でも構いません。 サンプルshをぜひご教授宜しく御願いいたします。