Yan*_*Zhu 7 linux filesystems tar large-files
我有一个包含 30M 小文件的大文件夹。我希望将文件夹备份成 30 个档案,每个 tar.gz 文件将有 1M 个文件。拆分成多个档案的原因是解压一个大档案需要一个月的时间。要拆分的管道 tar 也不起作用,因为在解压文件时,我必须将所有档案一起分类。
另外,我希望不要将每个文件 mv 到一个新目录,因为对于这个巨大的文件夹,即使是 ls 也是非常痛苦的。
我写了这个 bash 脚本来做到这一点。它基本上形成了包含文件的名称进入每个焦油一个数组,然后开始tar在平行于所有的人。这可能不是最有效的方式,但它会按照您的意愿完成工作。不过,我可以预期它会消耗大量内存。
您需要在脚本开头调整选项。您可能还想更改cvjf最后一行中的 tar 选项(例如删除详细输出v以提高性能或将压缩更改j为z等...)。
#!/bin/bash
# User configuratoin
#===================
files=(*.log) # Set the file pattern to be used, e.g. (*.txt) or (*)
num_files_per_tar=5 # Number of files per tar
num_procs=4 # Number of tar processes to start
tar_file_dir='/tmp' # Tar files dir
tar_file_name_prefix='tar' # prefix for tar file names
tar_file_name="$tar_file_dir/$tar_file_name_prefix"
# Main algorithm
#===============
num_tars=$((${#files[@]}/num_files_per_tar)) # the number of tar files to create
tar_files=() # will hold the names of files for each tar
tar_start=0 # gets update where each tar starts
# Loop over the files adding their names to be tared
for i in `seq 0 $((num_tars-1))`
do
tar_files[$i]="$tar_file_name$i.tar.bz2 ${files[@]:tar_start:num_files_per_tar}"
tar_start=$((tar_start+num_files_per_tar))
done
# Start tar in parallel for each of the strings we just constructed
printf '%s\n' "${tar_files[@]}" | xargs -n$((num_files_per_tar+1)) -P$num_procs tar cjvf
Run Code Online (Sandbox Code Playgroud)
首先,所有与所选模式匹配的文件名都存储在数组中files。接下来,for 循环对该数组进行切片并从切片中形成字符串。切片的数量等于所需的 tarball 的数量。结果字符串存储在数组中tar_files。for 循环还将生成的 tarball 的名称添加到每个字符串的开头。的元素tar_files采用以下形式(假设 5 个文件/tarball):
tar_files[0]="tar0.tar.bz2 file1 file2 file3 file4 file5"
tar_files[1]="tar1.tar.bz2 file6 file7 file8 file9 file10"
...
Run Code Online (Sandbox Code Playgroud)
脚本的最后一行xargs用于启动多个tar进程(最多达到指定的最大数量),每个进程将tar_files并行处理数组的一个元素。
文件列表:
$ls
a c e g i k m n p r t
b d f h j l o q s
Run Code Online (Sandbox Code Playgroud)
生成的压缩包: $ls /tmp/tar* tar0.tar.bz2 tar1.tar.bz2 tar2.tar.bz2 tar3.tar.bz2
| 归档时间: |
|
| 查看次数: |
5960 次 |
| 最近记录: |