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 -print0Null로 구분된 데이터를 보냅니다.
  • parallel -0Null로 구분된 데이터를 읽습니다.
  • -l 50각 실행마다 50줄을 읽습니다.
  • -j 1하나의 작업을 병렬로 실행하는 경우 자신에게 가장 적합한 것으로 변경할 수 있습니다(보유한 CPU 스레드 수와 I/O 속도에 따라 다름).
  • {#}시퀀스 번호(0-n)로 대체됩니다.
  • {}50개의 파일 이름으로 대체됩니다.

그런 다음 원하는 대로 이동 *.tar.gz하거나 이름을 바꿀 수 있습니다 .*.tar

tar이는 기존 tar에 추가하는 모든 파일을 호출하는 것보다 훨씬 빠릅니다 .

관련 정보