So komprimieren Sie 3000 Bilder in Stapeln von 50

So komprimieren Sie 3000 Bilder in Stapeln von 50

Ich habe einen Ordner mit über 3000 Bildern, ich möchte 50 davon einzeln komprimieren und in Tar-Dateien speichern.

Die Bilder sind nicht fortlaufend benannt.

Wie schreibe ich ein Bash-Skript, das diese Aufgabe erledigt?

Antwort1

Nehmen wir an, Ihre Bilder sind in gespeichert, ~/Pictureswas eine Abkürzung für ist /home/USER_ID/Pictures. Platzieren Sie die folgenden Befehle in Ihrem Home-Verzeichnis in einer Skriptdatei namens CompressImages. Machen Sie die Datei ausführbar mit:

chmod a+x ~/CompressImages

Rufen Sie das Skript auf mit:

~/CompressImages

Kopieren Sie das folgende Skript in die Datei ~/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

Überprüfen Sie nach dem Ausführen CompressImagesdes Skripts die Ergebnisse:

$ 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

Antwort2

Sie können dies folgendermaßen tun parallel -l 50:

cd /path/to/images

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

Fügen Sie -iname "*.jpg"dem Suchbefehl etwas Ähnliches hinzu, wenn auch andere Dateien vorhanden sind.

zLassen Sie die Option „von“ weg tarund nennen Sie sie .tarstattdessen „, tar.gzwenn Ihre Bilder bereits komprimiert sind (was beispielsweise bei der Fall wäre jpg).

Erläuterung:

  • find -print0sendet durch Nullen getrennte Daten
  • parallel -0liest null-getrennte Daten
  • -l 50Lesen Sie 50 Zeilen für jede Ausführung
  • -j 1führt eine Aufgabe parallel aus. Sie können es so ändern, wie es für Sie am besten funktioniert (hängt davon ab, wie viele CPU-Threads Sie haben und wie schnell Ihre E/A ist).
  • {#}wird durch die Sequenznummer (0-n) ersetzt
  • {}wird durch die 50 Dateinamen ersetzt.

*.tar.gzSie können es dann *.tarnach Belieben verschieben/umbenennen .

Dies ist viel schneller, als den Aufruf tarfür jede Datei durchzuführen und sie zu einem vorhandenen Tar hinzuzufügen.

verwandte Informationen