我有一个包含 27K 个文件的目录,我想将它们压缩成多个独立的tar 文件,每个文件有 5000 个文件,最后一个文件显然有 2K(27K 不能被 5 整除)。
实现此目的最快/最简单的方法是什么?
答案1
首先创建每个档案的文件名:
find <directory> | split -l 5000 - files.
然后创建 tar:
for f in files.*; do tar -cf $f.tar --files-from $f; done
虽然尚未测试,但基本思想应该可行。
答案2
#!/bin/bash
files=( dir/* )
n=1
for ((i = 0; i < ${#files[@]}; i+=5000)); do
IFS=$'\n' tar cvzf foo_$((n++)).tgz --files-from - <<<"${files[*]:i:5000}"
done
解释
创建一个名为的数组files
,其中包含目录的所有内容dir
。迭代数组,每次增加迭代器 5000。使用offset 参数扩展在数组上每次执行最多 5000 个项目的滑动窗口,"${files[@]:i:5000}"
并将其传递给文件名,并在每次调用时tar
将文件名增加一。$((n++))