我怎样才能对 300 万个 JPG 文件运行 mogrify?

我怎样才能对 300 万个 JPG 文件运行 mogrify?

我在 Linux CentOS 6 服务器中存储了 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

xargs支持一个-n参数来限制传递给其调用的参数的数量:

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

这将针对每张图片启动一次 mogrify。由于 mogrify 每次只能处理一个文件,所以只能采用这种方式。

答案2

使用find和时xargs,无需为 命名文件xargs。它将从 中获取文件列表find

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

-n100将用 100 秒的时间处理图像。即使文件名包含空格,管道也能正常工作-print0-0

您也可以mogrify直接从 find 调用,理想情况下如果它支持+结尾exec

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

答案3

使用 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

这需要 ImagemagickGhostscript待安装。适用于 Linux/Mac OS X/Microsoft Windows。

如果您希望在每个图像上添加文件名,您可以用以下命令替换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))

(看-注释文檔

答案4

正如所提到的所以,你也可以这样做:

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

相关内容