Как сжать 3000 изображений в пакетах по 50

У меня есть папка с более чем 3000 изображений, я хочу сжать 50 из них по отдельности и сохранить их в tar-файлах.

Изображения не имеют серийного названия.

Как использовать написать скрипт bash, который выполняет эту работу?

1
задан 18 June 2019 в 12:41

2 ответа

Давайте предположим, что ваши изображения хранятся в ~/Pictures, что является сокращением для /home/USER_ID/Pictures. Поместите следующие команды в свой домашний каталог в файл сценария с именем CompressImages. Сделайте файл исполняемым, используя:

chmod a+x ~/CompressImages

Вызовите скрипт, используя:

~/CompressImages

Скопируйте следующий скрипт в файл ~/CompressImages:

#!/bin/bash

# Where to store Tars? We don't want in Images directory
COMPRESSED_DIR="$HOME/Downloads"
# TARs created with name below + "_999.tar"
TAR_NAME="CompressedImages"
# Directory Images are located in
FILES="$HOME/Pictures/*"

FileCount=50     # Number of files compressed into one Tar
TarCount=0       # Count of Tars created

i=0
for f in $FILES
do
    if [[ $(( i % FileCount )) -eq 0 ]] ; then
        let TarCount++
        TarName="$COMPRESSED_DIR/$TAR_NAME$TarCount.tar"
        tar -cvpf "$TarName" "$f"   # create .tar & add first file
    else
        tar -rvpf "$TarName" "$f"   # Add to existing tar
    fi
    let i++
done

После запуска скрипта CompressImages проверьте результаты:

$ ll -h ~/Downloads/*.tar

-rw-rw-r-- 1 rick rick  14M Jun 18 16:55 Downloads/CompressedImages10.tar
-rw-rw-r-- 1 rick rick  48M Jun 18 16:55 Downloads/CompressedImages11.tar
-rw-rw-r-- 1 rick rick  16M Jun 18 16:55 Downloads/CompressedImages12.tar
-rw-rw-r-- 1 rick rick  55M Jun 18 16:55 Downloads/CompressedImages13.tar
-rw-rw-r-- 1 rick rick  45M Jun 18 16:55 Downloads/CompressedImages14.tar
-rw-rw-r-- 1 rick rick  43M Jun 18 16:55 Downloads/CompressedImages15.tar
-rw-rw-r-- 1 rick rick  37M Jun 18 16:55 Downloads/CompressedImages16.tar
-rw-rw-r-- 1 rick rick  38M Jun 18 16:55 Downloads/CompressedImages17.tar
-rw-rw-r-- 1 rick rick  44M Jun 18 16:55 Downloads/CompressedImages18.tar
-rw-rw-r-- 1 rick rick  47M Jun 18 16:55 Downloads/CompressedImages19.tar
-rw-rw-r-- 1 rick rick 180M Jun 18 16:55 Downloads/CompressedImages1.tar
-rw-rw-r-- 1 rick rick  53M Jun 18 16:55 Downloads/CompressedImages20.tar
-rw-rw-r-- 1 rick rick  33M Jun 18 16:55 Downloads/CompressedImages21.tar
-rw-rw-r-- 1 rick rick  13M Jun 18 16:55 Downloads/CompressedImages22.tar
-rw-rw-r-- 1 rick rick  26M Jun 18 16:55 Downloads/CompressedImages23.tar
-rw-rw-r-- 1 rick rick 1.4M Jun 18 16:55 Downloads/CompressedImages24.tar
-rw-rw-r-- 1 rick rick  13M Jun 18 16:55 Downloads/CompressedImages2.tar
-rw-rw-r-- 1 rick rick  15M Jun 18 16:55 Downloads/CompressedImages3.tar
-rw-rw-r-- 1 rick rick  23M Jun 18 16:55 Downloads/CompressedImages4.tar
-rw-rw-r-- 1 rick rick  11M Jun 18 16:55 Downloads/CompressedImages5.tar
-rw-rw-r-- 1 rick rick  12M Jun 18 16:55 Downloads/CompressedImages6.tar
-rw-rw-r-- 1 rick rick  20M Jun 18 16:55 Downloads/CompressedImages7.tar
-rw-rw-r-- 1 rick rick 7.4M Jun 18 16:55 Downloads/CompressedImages8.tar
-rw-rw-r-- 1 rick rick  21M Jun 18 16:55 Downloads/CompressedImages9.tar
1
ответ дан 18 June 2019 в 12:41

Можно сделать то использование parallel -l 50:

cd /path/to/images

find . -maxdepth 1 -type f -print0 \
| parallel -0 -l 50 -j 1 tar cvpzf {#}.tar.gz {}

Добавить -iname "*.jpg" или подобный находке управляют, существуют ли другие файлы, также.

Не учесть z опция от tar и назовите его .tar вместо tar.gz если бы Ваши изображения уже сжаты (который имел бы место с, например. jpg).

Объяснение:

  • find -print0 отправляет разграниченные пустым указателем данные
  • parallel -0 считывает разграниченные пустым указателем данные
  • -l 50 считайте 50 строк для каждого выполнения
  • -j 1 выполняет одну задачу параллельно, можно изменить ее на то, какие работы лучше всего для Вас (зависит от того, сколько потоков ЦП Вы имеете и как быстро Ваш ввод-вывод).
  • {#} будет заменен порядковым номером (0-n)
  • {} wil быть замененным этими 50 именами файлов.

Можно затем переместиться/переименовать *.tar.gz или *.tar к Вашей симпатии.

Это будет путем быстрее, чем вызов tar для каждого файла, добавляющего его к существующему tar.

0
ответ дан 7 December 2019 в 15:01

Другие вопросы по тегам:

Похожие вопросы: