質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

3回答

2186閲覧

大量ファイルのzip圧縮方法

kazunii_ac

総合スコア20

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

シェルスクリプト

シェルスクリプトは、UNIX系のOSもしくはコマンドラインインタプリタ向けに記述されたスクリプト。bash/zshといったシェルによって実行されるため、このように呼ばれています。バッチ処理などに使用されており、テキストファイルに書かれた命令を順に実行します。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2018/03/25 10:40

下記のような感じでエラーが出ます。
解決方法を教えてください。

実行コマンド:
/usr/bin/find /home/user/files/*.xlsx -mtime -1 -type f -print0 | xargs -0 zip -j -0 /home/user/files/20180324.zip

返ってくるエラー:
bash: /usr/bin/find: 引数リストが長すぎます

経緯:
もともと、単純なzipコマンドで大量のファイルを圧縮したかったのですが、「引数リストが長すぎます」エラーが出たため、
上記のfindコマンドを噛ます形にしておりました。

最近圧縮対象ファイル数が増えたためか、上記コマンドでも「引数リストが長すぎます」エラーが出るようになってしまいました。
圧縮対象ファイルは35000個ほどのExcelファイルです。
※phpexcelで、centos上で生成したものです。

解決方法がわかる方、お教え頂けないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

こんな漢字で、

bash

1$ /usr/bin/find /home/user/files -name '*.xlsx' -mtime -1 -type f -print0 | xargs -0 zip -j -0 /home/user/files/20180324.zip

追記

/usr/bin/find /home/user/files/*.xlsx ...

これだとfindが実行される前にbashがファイル名を全て展開しようとするので問題のエラーが発生します。

投稿2018/03/25 10:51

編集2018/03/25 11:01
hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/03/25 14:43

漢字→感じさえなければ・w・
kazunii_ac

2018/03/26 03:21

ありがとうごうざいます!!!解決したっぽいです!! 対象データ量が多いせいかだいぶ時間がかかっておりまして、いま実行中なのですが、まだ結果を確認できていません。 処理終了しましたらまたご連絡します!!!
kazunii_ac

2018/03/27 10:55

バッチリ正常終了したことを確認できました。 ありがとうございます~~!!!
guest

0

findをかますといっても、これではfindが仕事する前にシェルがワイルドカードを展開しようとするので、「引数リストが長すぎます」エラーへの対処としては意味がありません。
hichon氏が示しているように-name '*.xlsx'としてやれば展開なくfindに渡されるので、問題は発生しません。

また、下位ディレクトリの操作が必要ないならfindを使う意味はますますありません。シェルのforループを使うのが手軽でしょう。

bash

1for a in *.xlsx; do zip $a ; done

投稿2018/03/25 11:01

KojiDoi

総合スコア13671

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2018/03/25 11:30

これは、シェルのワイルドカード展開なので、同じ問題が発生する可能性があります。ディレクトリに移動してから実行するとディレクトリの分だけ短くなるので、大丈夫かも知れませんが、それならzip一発でも同じ。 あと、xargs を使わないとファイル数だけzipを実行するので時間が掛かります。
KojiDoi

2018/03/25 12:54

for の時にもワイルドカード展開が行われるというご指摘と思いますが、私が実験してみた限りはそうはなりませんでした。
KojiDoi

2018/03/25 12:59

それと、ファイル数だけzipが実行されるのはxargsでも同じなのでは?
otn

2018/03/25 14:18

> 私が実験してみた限りはそうはなりませんでした。 ほんとだ。 set -x してみると*がクォートされてますね。 失礼しました。 > ファイル数だけzipが実行されるのはxargsでも同じなのでは? こっちは違います。 システムの最大長もしくは指定した長さのコマンドライン長の範囲で、標準入力から読んだ行を横につなげます。
KojiDoi

2018/03/25 14:33

>xargs おおそれは知りませんでした。なかなか奥が深いですね。いつもxargs -i xxx {}みたいなのばかり使っているもので…。
guest

0

xargsを使えばできますよ

投稿2018/03/25 10:47

ikapy

総合スコア1167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ikapy

2018/03/25 10:57

ごめんなさい。xargs使ってましたね。回答後に気がつきました。後があるみたいなのでひっこみます。
kazunii_ac

2018/03/26 03:21

コメントありがとうございます! xargs、ほぼ理解できてなくてコピペ君のまま作業してます。しっかり勉強しようと思いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問