[OSX, BSD] カレントディレクトリに以下のディレクトリがあり

- AAA
- BBB
- CCC
- ...
これをそれぞれtar+gzip圧縮して
- AAA.tar.gz
- BBB.tar.gz
- CCC.tar.gz
- ...
をワンコマンドで作りたいのですけど、そういうことはできますか?

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2011/01/28 19:57:52
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント60pt

bourne shell だと、こんな感じ。

for d in * ; do (tar cf - $d | gzip -c > $d.tar.gz) ; done

tar が GNU tar なら、こうでも良い。

for d in * ; do (tar czf $d.tar.gz $d) ; done
id:room661

おお、できました。すばらしい。

xargsをどう使うかで悩んでたんですが、for inを使えば良いのですね。

すっきりしました。

2011/01/28 19:55:13

その他の回答1件)

id:windofjuly No.1

回答回数2625ベストアンサー獲得回数1149

ポイント10pt

Macで動かしていないので、まずはprintにて正常なコマンドが生成されるかの確認を行ってみてください

#!/usr/bin/perl --
opendir( DH, './') or die ("ディレクトリオープン失敗"); # このファイルの置かれれいるディレクトリ内を対象としています
@dir = readdir( DH );
foreach( @dir ) {
    if ( -d $_ ) {
        print "tar czvf $_.tar.gz $_\n";
    }
}
closedir( DH );

上記で問題が無ければprintの行を下記に入れ替えてください

        system("tar czvf $_.tar.gz $_");
id:room661

回答ありがとうございます。

ですが、シェルコマンドのみでの解決を求めています (私の質問が曖昧でした)。

2011/01/28 11:39:17
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154ここでベストアンサー

ポイント60pt

bourne shell だと、こんな感じ。

for d in * ; do (tar cf - $d | gzip -c > $d.tar.gz) ; done

tar が GNU tar なら、こうでも良い。

for d in * ; do (tar czf $d.tar.gz $d) ; done
id:room661

おお、できました。すばらしい。

xargsをどう使うかで悩んでたんですが、for inを使えば良いのですね。

すっきりしました。

2011/01/28 19:55:13
  • id:windofjuly
    うぃんど 2011/01/28 14:12:58
    もしも、私の返答をお待ちで a-kuma3 さんの回答をオープンしないという状況だったら申し訳ないので途中ですがコメントしておきます
    シェルで行う場合は下記のような構文で連続実行できるのですが、ディレクトリ名の末尾に不要な/が付いたままになってしまうため解決に至らずにいます
    for f in `ls|grep /$`; do echo $f; done
  • id:windofjuly
    うぃんど 2011/01/28 20:11:07
    カレントディレクトリ直下にはファイルが1つもなくてAAAなどのディレクトリのみが存在していたのですね・・・考えすぎてました(苦笑)
  • id:sayo212sayo
    コメント荒らし キタ━━(━(━(-( ( (゚∀゚) ) )-)━)━) ━━ !!!!!
     
    環境がない時は回答しないポリシーじゃなかったっけww

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません