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
何百万ものファイルの品質を変更するにはどうすればよいですか?
xargs
は-n
引数をサポートして、呼び出されるものに渡される引数の量を制限します。
find -type f -name '*.jpg' -size +1M -print0 | xargs -0 -n1 mogrify -quality 50
これにより、画像ごとに1回mogrifyが起動します。 mogrifyは一度に1つのファイルしか処理できないため、これが方法です。
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 {} +
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 ドキュメントを参照)
[〜#〜] so [〜#〜] で述べたように、次のこともできます。
$ find -type f -name "*..jpg" -size +1M > my_jpeg.txt
$ mogrify -quality 50 @my_jpegs.txt