web-dev-qa-db-ja.com

300万を超えるJPGファイルでmogrifyを実行するにはどうすればよいですか?

Linux CentOS6サーバーに300万のJPGファイルが保存されています。

品質を1メガバイトを超える%50ファイルサイズに変更したい。このコマンドを作成しましたが、「引数リストが長すぎます」というエラーが発生しました。

$ find -type f -name "*..jpg" -size +1M | xargs mogrify -quality 50 *.jpg
bash: /usr/bin/xargs: Argument list too long

何百万ものファイルの品質を変更するにはどうすればよいですか?

1
Metin Çelik

xargs-n引数をサポートして、呼び出されるものに渡される引数の量を制限します。

find -type f -name '*.jpg' -size +1M -print0 | xargs -0 -n1 mogrify -quality 50

これにより、画像ごとに1回mogrifyが起動します。 mogrifyは一度に1つのファイルしか処理できないため、これが方法です。

2

findおよびxargsを使用する場合、xargsのファイルに名前を付ける必要はありません。 findからファイルのリストを取得します。

find -print0 -type f -name '*.jpg' -size +1M | xargs -0 -n100 mogrify -quality 50

-n100は画像を100秒単位で処理します。 -print0および-0は、ファイル名に空白が含まれている場合でもパイプを機能させます。

Findから直接mogrifyを呼び出すこともできます。理想的には、execで終わる+をサポートしている場合です。

find  -type f -name '*.jpg' -size +1M -exec mogrify -quality 50 {} +
1
choroba

Python + convertを使用したクロスプラットフォームソリューション:現在のディレクトリのすべてのPDFファイルをPNGファイル(必要に応じてJPGに変更できます)にマルチスレッドで変換します。

_from __future__ import print_function
import os
import glob
import multiprocessing      

def convert_to_png(pdf_filepath):
    '''
    Convert PDF file to PNG file
    '''
    png_filepath = '{0}.png'.format(pdf_filepath[:-4])
    print('pdf_filepath: {0}'.format(pdf_filepath))
    print('png_filepath: {0}'.format(png_filepath))
    command = 'convert -background white -alpha off -geometry 1600x1600 -density 200x200 -quality 100 -resize 800x {0} {1}'.format(pdf_filepath, png_filepath)
    print(command)
    os.system(command)

def main():
    pdf_filepaths = glob.iglob(os.path.join('.','*.pdf'))
    pool = multiprocessing.Pool(processes=4)
    pool.map(convert_to_png, pdf_filepaths)
    pool.close()
    pool.join()   
    print('done')

if __name__ == "__main__":
    main()
    #cProfile.run('main()') # if you want to do some profiling
_

これには、 Imagemagick および Ghostscript がインストールされている必要があります。 Linux/Mac OS X/MicrosoftWindowsで動作します。

各画像にファイル名を追加したい場合は、convert_to_png()のコマンドを次のように置き換えることができます。

_command = 'convert  -background white -alpha off -geometry 1600x1600 -density 200x200 -quality 100 -annotate +50+50 {2} -resize 800x {0} {1}'.format(pdf_filepath, png_filepath, os.path.basename(pdf_filepath))
_

-annotate ドキュメントを参照)

0

[〜#〜] so [〜#〜] で述べたように、次のこともできます。

$ find -type f -name "*..jpg" -size +1M > my_jpeg.txt
$ mogrify -quality 50 @my_jpegs.txt
0
malat