• 締切済み

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 と出てしまいます。ご教授宜しく御願いいたします。

みんなの回答

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.6

ようやくやりたいことがわかってきました。そういうことであれば、tarするファイル名はパスを含めちゃ駄目です。 <(...) が使えるなら、 tar czf /bbb/test.tar.gz -C /aaa -T <(cd /aaa;/bin/ls -1) だめなら、 (cd /aaa; /bin/ls -1 > /tmp/filelist ) tar czf /bbb/test.tar.gz -C /aaa -T /tmp/filelist #1の人が、作成時には -C オプションが効かないと書いてますけど、私の手元だと効きますね(Fedora9)。

tanpopo012
質問者

お礼

両方、できました!ありがとうございました。 -Cオプション効きました。

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.5

tar の -T オプションで、アーカイブするファイル名を、コマンドラインでなくファイルで指定できます。 cd /aaa ls -1 > /bbb/filelist # アーカイブしたいファイル名を1行ずつ書く tar czf /bbb/test.tar.gz -T /bbb/filelist またはcdせずに、 find /aaa -maxdepth 1 -type f > /bbb/filelist # findのオプションは希望に応じて適当に tar czf /bbb/test.tar.gz -T /bbb/filelist 後者はワークファイルを作らずに bash の <( ) というコマンド置換を使って、こうも書けます。 tar czf /bbb/test.tar.gz -T <(find /aaa -maxdepth 1 -type f) ただ、これはエラーになる環境もあるようです。Fedora9では出来ました。 >(| xargs tar rfz /bbb/test.tar.gz のように)、xargs: tar: terminated by signal 6 というエラーが出ました。 引数が長すぎる対処として、一度のtarでアーカイブするファイルをコマンドラインの制限長まで減らして何度かに分けてアーカイブするというのがxargsを使う方法ですが、 tar の r オプションはファイルにどんどん追加していくので、圧縮されていては追加できないと言うことでしょう。

tanpopo012
質問者

補足

-Tオプションをつけても、圧縮元ファイルを絶対パスで指定すると 以下のようなエラーになりました。 tar: Removing leading `/' from member names /aaa/の中身は 1 (/aaa/1) 2 (/aaa/2) なのですが、 /bbb に test.tar.gz は出来ますが、これを解凍してみると 以下のように、圧縮したいデータの絶対パスの ディレクトリー構造そのままが出来てしまいました。 /bbb/aaa/1 /bbb/aaa/2 環境はredhat linux4 です。 >tar の r オプションはファイルにどんどん追加していくので、圧縮されていては追加できないと言うことでしょう。 なるほど、そういうことだったんですね。ありがとうございました。

回答No.4

*だと、.で始まるファイルが含まれないので tarで .(カレントディレクトリ指定) のほうがいいんじゃないですか?

tanpopo012
質問者

お礼

なるほど、ありがとうございます。

noname#208124
noname#208124
回答No.3

>>・* だとすべてのファイルをアーカイブするとは限らない >そうなんですか、ディレクトリー下のファイル全部を一括で指定するにはどうしたらいいんでしょう ANo.1の人が*でなく.を使った意味を理解しましょう xargs を使うなら find /aaa/ -type f | xargs tar rf test.tar ; gzip test.tar ただしGNU tarでないとtarファイルがない状態からrオプションの使用は出来ません

tanpopo012
質問者

補足

>ANo.1の人が*でなく.を使った意味を理解しましょう ということで、以下でも出来ました。 cd /aaa; echo * | xargs tar rf /bbb/test.tar; cd /bbb; gzip test.tar ところで tar するとき、zオプションで一気に tar.gz にしようとおもったのですが、(| xargs tar rfz /bbb/test.tar.gz のように)、xargs: tar: terminated by signal 6 というエラーが出ました。教えて頂いたように、まず tar にして、gzip にするのと、どのように違っているのでしょうか。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

「圧縮元と圧縮ファイル作成先を指定する」ことと argument list too long とは関係ありません. 区別してください. argument list too long の意味は (ただの英語なので) 推測すること. とりあえず tar の f ではディレクトリも指定できるので cd /aaa tar zcf /bbb/test.tar.gz * でいいし, これを 1行にするだけなら ; で区切って cd /aaa; tar zcf /bbb/test.tar.gz * とすればいい. ところで, ・(tar によっては)「アーカイブするファイルを絶対パスで指定するのは危険」 ・* だとすべてのファイルをアーカイブするとは限らない ・cd /aaa; tar zcf /bbb/test.tar.gz * と cd /; tar zcf /bbb/test.tar.gz /aaa/* は意味が違う んだけど, その辺は大丈夫? 実は tar zcf /bbb/test.tar.gz /aaa とか tar zcf /bbb/test.tar.gz -C /aaa . でよかったりして....

tanpopo012
質問者

補足

>・(tar によっては)「アーカイブするファイルを絶対パスで指定するのは危険」 やってみると、/aaa/* の * を圧縮するのではなく、 /aaa/* というディレクトリー構造をそのまま圧縮しており、 解凍すると、このままの構造が展開されてしまいました。 -Cオプションでは、変なエラーが出て進みませんでした。 >・* だとすべてのファイルをアーカイブするとは限らない そうなんですか、ディレクトリー下のファイル全部を一括で指定するにはどうしたらいいんでしょう >・cd /aaa; tar zcf /bbb/test.tar.gz * と cd /; tar zcf /bbb/test.tar.gz /aaa/* は意味が違う んだけど, その辺は大丈夫? 大丈夫です。 argument list too long  は、仰るとおり、別の問題で、 圧縮しようとしているファイルが多すぎるために出るエラーです。 xarge を使って回避する方法があったと思いますが、引き続き みなさんのご回答をお待ちしています。

  • ann_dv
  • ベストアンサー率43% (528/1223)
回答No.1

展開時なら、-Cオプションが使えるのですが、アーカイブ時では使えないようです。 (cd /aaa ; tar zcf /bbb/test.tar.gz .) では駄目でしょうか。

参考URL:
http://www.astro.phys.s.chiba-u.ac.jp/~miyaji/UNIX.world/tar.html
tanpopo012
質問者

補足

cd /aaa; tar zcf /bbb/test.tar.gz * で1行にまとまり、動作オッケーでした。ありがとうございます。 argument list too long というエラーが出るのは、また別の問題で、tarしようとしているaaa下に大量のディレクトリーとファイルがあるためです。 ‘argument list too long‘を回避するために xarge を使った方法があったと思いますが、引き続き 皆さんのご回答をお待ちしています。

関連するQ&A

  • [unixのシェルコマンド]のエラー「zip: argument list too long」を回避する方法について

    telnetでログインして、 unixのシェルコマンドを使って圧縮 % zip file.zip filename/* すると、 zip: argument list too long というエラーが出てしまいます。 凡そ40万ファイル程度あるのですがこれを 一括で簡単に圧縮したいのですが何か良い方法は無いでしょうか?

  • 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をお勧めしているようですが そちらもだめでした。 どなたか解決策をご存知の方がいたらご教授願います。

  • 3日以前のバックアップを削除する

    /etc/crontabで以下のbackup.shを毎晩実行するのですが、 3日以前のものは毎回消していく場合は以下のような、 少し初心者的な書き方しか現在分からないのですが、 他にもし良い書き方があれば、教えていただけますでしょうか? よろしくお願いします。 #!/bin/sh DATE_1=`date -d '1 day ago' +%Y%m%d` DATE_2=`date -d '2 days ago' +%Y%m%d` DATE_3=`date -d '3 days ago' +%Y%m%d` if [ test_$DATE_2.tar.gz ]; then mv -f test_$DATE_2.tar.gz test_$DATE_3.tar.gz fi rm -f test_$DATE_3.tar.gz if [ test_$DATE_1.tar.gz ]; then mv -f test_$DATE_1.tar.gz test_$DATE_2.tar.gz fi if [ test.tar.gz ]; then mv -f test.tar.gz test_$DATE_1.tar.gz fi tar zcvf test.tar.gz /usr/local/test

  • bashの関数の引数にスペースが入るとズレる件

    bashの関数の引数にスペースが入るとズレる件 bashの関数の引数にスペースが入ると、引数が分離して、位置がズレてしまいます。 これを回避する方法はありませんか? ■aaa.sh-Top #!/bin/bash declare FuncPara1 declare FuncPara2 function f_echo() { echo 'uf_echo1='$1 echo 'uf_echo2='$2 echo 'uf_echo3='$3 } echo '---test1---' FuncPara1='aaabbb' FuncPara2='ccc' f_echo ${FuncPara1} ${FuncPara2} echo '---test2---' FuncPara1='aaa bbb' FuncPara2='ccc' f_echo ${FuncPara1} ${FuncPara2} ■aaa.sh-Bottom ■aaa.shの実行 # ./aaa.sh ---test1--- uf_echo1=aaabbb uf_echo2=ccc uf_echo3= ---test2--- uf_echo1=aaa uf_echo2=bbb uf_echo3=ccc このtest2の時に、 ---test2--- uf_echo1=aaa bbb uf_echo2=ccc uf_echo3= となって欲しい。 もしくは、何かしら「なったテイ」で、 引数1の値は「aaa bbb」 引数2の値は「ccc」 と関数側で判断できる方法はありませんか?

  • tar.gzファイルのリストアについて

    Postgres初心者です。 教えてください。 pg_dumpコマンドでdump拡張しのバックアップファイルを生成し、 tarコマンドで****.tar.gzファイルに圧縮しました。 このtar.gzのファイルを直接リストアするコマンドがあれば 教えていただけないでしょうか? -bash-3.2$pg_restore -U postgres -d (データベース名) < ****.tar.gz と実行すると、以下のエラーメッセージが表示されます。 →pg_restore: [アーカイバ] 入力ファイルが有効なアーカイブではないようです。 -bash-3.2$gunzip -C ****.tar.gz | pg_restore -d (データベース名) と実行すると、以下のエラーメッセージが表示されます。 →pg_restore: [tarアーカイバ] tarアーカイブ内でファイルtoc.dat用のファイルヘッダがありませんでした よろしくお願い致します。

  • mvコマンドでリネームするときに、長いファイル名の一部だけを変更したい場合の簡単なやり方

    ファイル名として、 long_filename_ver001.tar.gz を long_filename_ver001.tar.gz.org にしたいときなど、 mv long_filename_ver001.tar.gz long_filename_ver001.tar.gz.org と打ち込みますが、 mv long_filename_ver001.tar.gz から、 mv long_filename_ver001.tar.gz long_filename_ver001.tar.gz まで簡単に打ち込むショートカットなどありませんか? まず、 mv ファイル名 ファイル名 と左右のファイル名を同じにして、変更先(右側)のファイル名に.orgをつけたり、Ver002にしたり、と一部だけ修正したいのです。 ※似たようなファイル名がたくさんあるので、TAB補完は使わない方法を探しています。 よろしくお願いいたします。

  • 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を使っていて、同じことをやっているのですが そちらはうまく行っているのです。 どなたか解決策などご存知でしたら教えてください。 同じような質問が過去にもあったようなのですが、未解決で終わっていました。

  • 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

  • 変数の引き継ぎ(bash)

    bashで開発をしているのですが、 メインの変数より子シェルの変数に引き継ぎをしたいのですが、 どうすればいいのでしょうか。 test.sh #!/bin/bash # 外部変数 sub_test() { echo $1 } # メイン sub_test # test.sh AAA シェルを実行すると、AAAという文字が出てきません。 宜しくお願いします。

  • 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はまだ使ったことありませんが、こちらを使った方がサーバーへの負荷や扱いやすさでは上なのでしょうか? ご教授お願い致します。