我有一个大量的文件夹数量,我想将它们 zip/gzip/(无论什么)压缩成 3 个或更多独立文件。
例如,假设我的服务器上有以下目录:
/dir1
/dir2
/dir3
/dir4
/dir5
/dir6
我需要以某种方式将它们压缩成 3 个单独的 zip 文件。它们看起来如下:
集合1.zip
/dir1
/dir2
/dir3
集合2.zip
/dir4
/dir5
/dir6
collection3.zip
/dir7
/dir8
/dir9
答案1
抱歉,我没有足够的信用来发表评论。但类似这样的内容应该可以帮助您压缩文件夹。
#! /bin/bash
DIR=$1
i=0
arr=()
zipnum=0
cd $DIR
for item in *
do
if [[ -d $item ]]; then
if [ $i -lt 2 ]; then
arr+=($item)
((i++))
else
arr+=($item)
zip ${arr[@]} $zipnum
((zipnum++))
i=0
arr=()
fi
fi
done
((zipnum++))
zip ${arr[@]} $zipnum
它应该可以工作(没有时间测试它)将文件保存为 zip.sh 并运行为 ./zip.sh /your/directory/here 至于文件传输,你不能只在服务器上安装 ftp 客户端并通过 ftp 传输文件吗?
答案2
下面的脚本在 CentOS 6.5 上测试过。
遍历指定文件夹下的文件,并将它们逐个添加到不大于指定最大大小的 zip 文件中。一次将文件添加到 zip 可能会导致 CPU 或存储 I/O 峰值:
#!/bin/bash
files_folder="/home/username/public_html/"
zip_folder="/home/username/"
zip_maxsize=524288000 # 500 MB
zip_prefix="archive"
zip_suffix=0
cd ${files_folder}
for FILE in $(find . -type f); do
zip_file="${zip_folder}${zip_prefix}-${zip_suffix}.zip"
if [ -f ${zip_file} ]; then
zip_size=$(ls -l ${zip_file} |cut -d' ' -f5)
fi
file_size=$(ls -l ${FILE} |cut -d' ' -f5)
comb_size=$((zip_size + file_size))
if [ ${comb_size} -gt ${zip_maxsize} ]; then
zip_suffix=$((zip_suffix + 1))
zip_file="${zip_folder}${zip_prefix}-${zip_suffix}.zip"
fi
zip -q ${zip_file} ${FILE}
done
答案3
我找到了一个简单的解决方案。
首先我列出了需要压缩的所有文件夹:
ls > list.txt
然后我从列表中删除了./
它。../
之后,我用文本编辑器将该列表分成 5 个不同的文件,例如listPart1
,,...listPart2
listPart3
我将这些列表放在包含所有需要压缩的文件夹的文件夹中,然后从该文件夹对每个列表运行此命令:
cat listPart1 | zip -r@ part1.zip