1

У меня есть 3 миллиона файлов JPG, хранящихся на сервере Linux CentOS 6.

Я хочу изменить качество на% 50 размер файла более 1 мегабайта. Я написал эту команду, но получил ошибку "список аргументов слишком длинный":

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

Как я могу изменить качество миллионов файлов?

3 ответа3

2

xargs поддерживает аргумент -n чтобы ограничить количество передаваемых аргументов тем, что он вызывает:

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

Это запустит 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 заставят канал работать, даже если имена файлов содержат пробелы.

Вы также можете вызвать mogrify напрямую из find, в идеале, если он поддерживает окончание + для exec:

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

Кроссплатформенное решение с 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/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))

(См. -Аннотировать документацию)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .