Tar Gzip 压缩目录中的所有 n 个文件

Tar Gzip 压缩目录中的所有 n 个文件

我有一个文件夹,里面有 7,491 个文件。我想以 100 个为一批对这些文件进行 tar gzip 压缩,例如

first 100 files > archive1.tar.gz
files 101-200 > archive2.tar.gz
files 201-300 > archive3.tar.gz

有没有办法通过命令行做到这一点?

答案1

最简单的选择可能是将该命令与/选项split结合使用:findtar-T--files-from

find ... -type f -print0 | 
  split -t '\0' -l 100 -d --filter 'tar czf archive-$FILE.tar.gz --files-from=- --null'

split还将负责设置具有连续编号的文件名(该-d选项设置编号文件名而不是通常的字母文件名)。

find通过和的组合xargs,我找不到获取档案可靠顺序编号的方法,因此我使用uuidgen

find <directory> -type f -print0 | xargs -n 100 -0 sh -c 'tar -czf archive-$(uuidgen).tar.gz "$@"' _

或者你可以使用 bash 循环:

count=1
N=100
find <directory> -type f -print0  | 
{
while true
do
    files=()
    for ((i=0;i<N;i++))   # Add N filenames to the `files` array
    do
        IFS= read -d '' -r file
        files+=("$file")
    done
    ((count++))
    tar -czf archive-$count.tar.gz "${files[@]}"
done
}

所有这些命令都假设不在find当前目录中运行。否则,您可能最终会打包一个 tar 文件。如果您必须在当前目录中运行它,那么我建议将文件名保存到一个文件中,然后从该文件中读取文件名以进行split循环xargs

相关内容