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
と出てしまいます。ご教授宜しく御願いいたします。
A 回答 (6件)
- 最新から表示
- 回答順に表示
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)。
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 オプションはファイルにどんどん追加していくので、圧縮されていては追加できないと言うことでしょう。
この回答への補足
-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で .(カレントディレクトリ指定) のほうがいいんじゃないですか?
No.3
- 回答日時:
>>・* だとすべてのファイルをアーカイブするとは限らない
>そうなんですか、ディレクトリー下のファイル全部を一括で指定するにはどうしたらいいんでしょう
ANo.1の人が*でなく.を使った意味を理解しましょう
xargs を使うなら
find /aaa/ -type f | xargs tar rf test.tar ; gzip test.tar
ただしGNU tarでないとtarファイルがない状態からrオプションの使用は出来ません
この回答への補足
>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 にするのと、どのように違っているのでしょうか。
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 .
でよかったりして....
この回答への補足
>・(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 を使って回避する方法があったと思いますが、引き続き
みなさんのご回答をお待ちしています。
No.1
- 回答日時:
展開時なら、-Cオプションが使えるのですが、アーカイブ時では使えないようです。
(cd /aaa ; tar zcf /bbb/test.tar.gz .)
では駄目でしょうか。
参考URL:http://www.astro.phys.s.chiba-u.ac.jp/~miyaji/UN …
この回答への補足
cd /aaa; tar zcf /bbb/test.tar.gz *
で1行にまとまり、動作オッケーでした。ありがとうございます。
argument list too long というエラーが出るのは、また別の問題で、tarしようとしているaaa下に大量のディレクトリーとファイルがあるためです。
‘argument list too long‘を回避するために
xarge を使った方法があったと思いますが、引き続き
皆さんのご回答をお待ちしています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Android tar.ファイルのインストールについて知りたいです 2 2022/07/23 15:34
- UNIX・Linux Linuxのtarコマンドで同一ディレクトリに解凍するコマンドは何でしょうか? 1 2022/04/25 12:59
- UNIX・Linux cpio使ってた人はtarが流行りだしてから焦ったり驚いたりしたか 1 2023/05/07 10:10
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- Mac OS PATHを使ってcdなどで簡単に移動できるようになりたい 3 2023/05/13 14:22
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- UNIX・Linux Linux(Fedora30)のブートディスクの交換について 2 2023/05/16 13:17
- Excel(エクセル) ¥マークを含むパスの処理について(マクロ、または関数) 2 2022/12/25 02:11
- その他(プログラミング・Web制作) VScodeでpythonプログラムの関数を実行したい 2 2022/07/13 19:24
- UNIX・Linux Linuxについて質問です。 以下のhistoryの出力結果から、sedコマンドのファイル名tmp1 1 2023/02/03 20:11
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Dirコマンドでフォルダ内ファイ...
-
テキストファイルから最終行の抽出
-
ファイル名についている「-」と...
-
Linuxで標準出力したファイルの...
-
ラズパイで『’test.service’をs...
-
DOSコマンドのFOR文で空白を含...
-
win11のエクスプローラーの右ク...
-
「Vmmem」のメモリ使用量が高い...
-
ファイル名一覧の印刷
-
DOS コマンドの~zfの意味を教え...
-
作成日時でのファイル検索
-
lsコマンドについて。
-
Windowsのコピーコマンド、この...
-
oracleの文字コードとlinuxサー...
-
ピクチャクリッピングのファイ...
-
エクスプローラーはデータを書...
-
Windows7 zip圧縮・解凍のコマンド
-
数字を複数回繰り返す正規表現...
-
ZIPファイルの作成をコマンドか...
-
BATファイルの記述で
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Dirコマンドでフォルダ内ファイ...
-
ファイル名についている「-」と...
-
テキストファイルから最終行の抽出
-
ラズパイで『’test.service’をs...
-
Linuxで標準出力したファイルの...
-
ファイル名一覧の印刷
-
batファイルの強制終了を回避し...
-
xcopyのエラー情報のはき...
-
DOSコマンドのFOR文で空白を含...
-
oracleの文字コードとlinuxサー...
-
「Vmmem」のメモリ使用量が高い...
-
ファイル名の -(ハイフン)を _(...
-
DOS コマンドの~zfの意味を教え...
-
特定の更新日付のファイルのみ...
-
ftpコマンドで丸ごとダウン...
-
~以外を削除する場合(rmコマ...
-
TeXでの見出しの変更は可能でし...
-
win11のエクスプローラーの右ク...
-
CUIとGUIのコピー速度の違いは?
-
数字を複数回繰り返す正規表現...
おすすめ情報