我有一个文件夹,里面有 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
结合使用:find
tar
-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
。