我有一個包含 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 中要快得多。