3000枚の画像を50枚ずつ圧縮する方法

3000枚の画像を50枚ずつ圧縮する方法

3000 枚を超える画像が入ったフォルダーがあり、そのうち 50 枚を個別に圧縮して tar ファイルに保存したいと考えています。

画像には連番が付けられていません。

この作業を実行する bash スクリプトをどのように記述すればよいでしょうか?

答え1

~/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

答え2

以下を使用してこれを行うことができます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"他にもファイルがある場合は、find コマンドに または を追加します。

画像がすでに圧縮されている場合は(例)、zオプションを省略しtar、代わりに という名前を付けます。.tartar.gzjpg

説明:

  • find -print0ヌル区切りのデータを送信する
  • parallel -0ヌル区切りのデータを読み取ります
  • -l 50実行ごとに50行を読み込む
  • -j 11 つのタスクを並列に実行する場合は、最適な方法に変更できます (CPU スレッドの数と I/O の速度によって異なります)。
  • {#}シーケンス番号(0-n)に置き換えられます
  • {}50 個のファイル名に置き換えられます。

その後、お好みに合わせ*.tar.gzて移動したり、名前を変更したりできます。*.tar

tarこれは、既存の tar に追加するすべてのファイルを呼び出すよりもはるかに高速です。

関連情報