如何壓縮大量子目錄,並讓每個zip文件包含N個子目錄
我讀過這個。但我試圖實現一些稍微不同的東西。
我有一個包含許多子目錄的目錄。我想用這些子目錄創建 zip 文件,但是我不想為每個子目錄創建一個單獨的 zip 文件,我想對它們進行分組——假設每個 zip 文件有 10 個子目錄。
編輯:所有子目錄都在一個深度!
非常感謝。
因此,我假設您要分組的所有子目錄都在您的父目錄下的一個深度級別。我們將讓
zip
遞歸進入子子目錄。***編輯:***感謝人們的建議,這個新版本現在適用於各種文件名,包括包含空格、換行符和特殊字元的名稱。可以在這裡找到關於此事的優秀文章: https ://unix.stackexchange.com/a/321757/439686
#!/bin/bash export rootdir=${1:-/your/parent/directory} export N=10 # group size export stamp=$(date +%s) find "$rootdir" -type d -mindepth 1 -maxdepth 1 -exec bash -c ' count=0 # group number while [ $# -gt 0 ] ;do ((count++)) zip -r "$rootdir/group.${stamp}.${count}.zip" "${@:1:N}" shift $N || set -- done ' "" {} +
結果:
group.1615512971.1.zip group.1615512971.2.zip group.1615512971.3.zip group.1615512971.4.zip ...
這是一個稍微不同的版本,它也循環通過位置參數,但沒有產生子shell。(這個比以前的版本執行得更快)
#!/bin/bash rootdir=/your/parent/directory N=10 # group size stamp=$(date +%s) readarray -td '' ARRAY < <(find "$rootdir" -type d -mindepth 1 -maxdepth 1 -print0) set -- "${ARRAY[@]}" count=0 while [ $# -gt 0 ] ;do ((count++)) zip -r "$rootdir/group.${stamp}.${count}.zip" "${@:1:N}" shift $N || set -- done
編輯#2:並行性和記憶體使用
在這裡閱讀這篇文章後: https : //unix.stackexchange.com/a/321765/439686 我突然想到,如果我們要處理大量目錄,我的前兩個版本可能會遇到一些嚴重的問題。除了給記憶體帶來一些嚴重壓力之外,它們的效率也很低,因為它們甚至在我們開始第一個命令
find
之前就在等待找到整個目錄列表。zip
如果我們在 parralell 中執行事情會更好——通過管道——然後有多少文件就無關緊要了。這給我們留下了唯一可能的正確解決方案——用find ... -print0 | xargs -0 command
. 為什麼xargs
?因為它可以一次啟動帶有 N 個參數的命令,而不是等待整個列表,而且還因為xargs
可以處理-print0
將要傳遞給它的零分隔字元串。而且我們絕對必須使用零作為分隔符,因為文件名允許包含任何其他字元,包括換行符。作為額外的獎勵,xargs
我們甚至可以同時啟動多個程序,以更好地利用多核系統。所以,這裡是:#!/bin/bash rootdir=${1:-/your/parent/directory} N=10 # group size mktemp --version >/dev/null || exit 1 stamp=$(date +%Y%m%d%H%M) cores=$(nproc) || cores=1 export rootdir N stamp cores find "$rootdir" -type d -mindepth 1 -maxdepth 1 -print0 \ | xargs -r0 --max-args=$N --max-procs=$cores bash -c ' zip -r "$(mktemp -u -p "$rootdir" group.$stamp.XXXXXX.zip)" "$@" ' ""
結果:
group.202103140805.7H1Don.zip group.202103140805.akqmgX.zip group.202103140805.fzBsUZ.zip group.202103140805.iTfmj8.zip ...