У меня есть папка с более чем 3000 изображений, я хочу сжать 50 из них по отдельности и сохранить их в tar-файлах.
Изображения не имеют серийного названия.
Как использовать написать скрипт bash, который выполняет эту работу?
Давайте предположим, что ваши изображения хранятся в ~/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
Можно сделать то использование 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.