Tengo una carpeta con más de 3000 imágenes, quiero comprimir 50 de ellas individualmente y almacenarlas en archivos tar.
Las imágenes no tienen nombre en serie.
¿Cómo utilizar la escritura de un script bash que haga este trabajo?
Respuesta1
Supongamos que sus imágenes están almacenadas en ~/Pictures
lo que es una abreviatura de /home/USER_ID/Pictures
. Coloque los siguientes comandos en su directorio personal en un archivo de script llamado CompressImages
. Haga que el archivo sea ejecutable usando:
chmod a+x ~/CompressImages
Llame al script usando:
~/CompressImages
Copie el siguiente script en el archivo ~/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
Después de ejecutar CompressImages
el script, verifique los resultados:
$ 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
Respuesta2
Puedes hacerlo usando parallel -l 50
:
cd /path/to/images
find . -maxdepth 1 -type f -print0 \
| parallel -0 -l 50 -j 1 tar cvpzf {#}.tar.gz {}
Agregue -iname "*.jpg"
o similar al comando de búsqueda si también hay otros archivos.
Omita z
la opción de tar
y asígnele un nombre .tar
en lugar de tar.gz
si sus imágenes ya están comprimidas (como sería el caso, por ejemplo jpg
).
Explicación:
find -print0
envía datos delimitados por nulosparallel -0
lee datos delimitados por nulos-l 50
leer 50 líneas para cada ejecución-j 1
ejecuta una tarea en paralelo, puede cambiarla a la que funcione mejor para usted (depende de cuántos subprocesos de CPU tenga y de qué tan rápida sea su E/S).{#}
será reemplazado por el número de secuencia (0-n){}
será reemplazado por los 50 nombres de archivos.
Luego puedes mover/renombrar *.tar.gz
o *.tar
a tu gusto.
Esto será mucho más rápido que solicitar tar
cada archivo y agregarlo a un tar existente.