Bash

如何壓縮大量子目錄,並讓每個zip文件包含N個子目錄

  • March 21, 2021

我讀過這個。但我試圖實現一些稍微不同的東西。

我有一個包含許多子目錄的目錄。我想用這些子目錄創建 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
...

引用自:https://unix.stackexchange.com/questions/638793