如何批量壓縮 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選項 fromtar並命名它,.tar而不是tar.gz如果您的映像已經被壓縮(例如就是這種情況jpg)。

解釋:

  • find -print0發送以空分隔的數據
  • parallel -0讀取以 null 分隔的數據
  • -l 50每次執行讀取 50 行
  • -j 1並行執行一項任務,您可以將其變更為最適合您的任務(取決於您擁有的 CPU 執行緒數以及 I/O 的速度)。
  • {#}將被替換為序號(0-n)
  • {}將被 50 個檔案名稱取代。

然後您可以移動/重命名*.tar.gz*.tar按照您的喜好。

tar這比調用每個檔案並將其添加到現有 tar 中要快得多。

相關內容