Tar Gzip 目录中每 n 个文件

Koh*_*ese 2 command-line gzip tar

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

first 100 files > archive1.tar.gz
files 101-200 > archive2.tar.gz
files 201-300 > archive3.tar.gz
Run Code Online (Sandbox Code Playgroud)

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

mur*_*uru 7

最简单的选择可能是将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'
Run Code Online (Sandbox Code Playgroud)

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

使用findand的组合xargs,我找不到获得档案可靠顺序编号的方法,所以我使用了uuidgen

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

或者你可以使用 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
}
Run Code Online (Sandbox Code Playgroud)

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