用于备份和恢复目录结构的 Bash 脚本

用于备份和恢复目录结构的 Bash 脚本

基本上我在 Linux 中有这种目录结构。

Backup
 Dir_1 
     Sub_Dir_1
          file_1  90 GB
          file_2  10 GB
     Sub_Dir_2
          file_1  20 GB

Restore
 Dir_1
     Sub_Dir_1
         file_1 0 bytes
         file_2 0 bytes
     Sub_Dir_2
         file_1 0 bytes

列表还在继续。
我可以 tar 整个目录,但由于每个子目录中的文件大小,这将需要一段时间。

我想要创建一个脚本,该脚本将备份整个目录结构,并能够在不同的计算机上恢复相同的目录,但子目录内的所有文件都清零。
我想要的只是它们的目录名和文件名。这可能吗?

答案1

划分子问题

一般来说,当您无法快速找到问题的完整解决方案时,您可以将其分成更容易解决的子问题。

  • 一种方法是创建tar目录结构的文件和list of files可以在目录结构内进行修改,之后可以进行压缩。您不需要创建整个目录结构,而且只有两个文件。
    使用touch命令[1]您可以更新文件的修改时间,如果不存在,您将创建一个空文件(!)。创建目录结构的副本后,您可以触碰里面的文件。

    该脚本可以在您当前目录中创建文件(tar+txt)。

    #!/bin/bash
    HomeDir=$(pwd)
    BackupDIR="Backup"      # Change here
    
    TarFileName="$HomeDir/Directory_Structure.tar"
    ListFileName="$HomeDir/File_List.txt"
    
    cd "$BackupDIR"
    
    tar -cf "$TarFileName"  --no-recursion --files-from <(find . -type d)
    find . -type f -exec echo touch \"{}\" \; > "$ListFileName"
    gzip --best "$ListFileName" "$TarFileName"    # this to compress them
    

    然后从包含两个文件的恢复目录中提取它们,你可以输入

    tar -zxf Directory_Structure.tar.gz
    zcat File_List.txt.gz | /bin/bash
    

    请注意,隐含的假设是您不关心文件的创建时间、所有权和属性,您的名字不是病态的,您没有链接......

  • 另一种方法是创建一个目录和结构的本地副本。再次创建目录结构的副本后,您可以触碰里面的文件。
    然后你可以用 备份所有文件tar

    缺点是原始的创建和修改时间、所有权和属性将丢失。如果需要,您必须手动添加,这将使您的脚本复杂化。(touch -d "$(date -R -r filename)" Restore/filename...)
    您将需要大量的 inode,如果您有数不胜数文件。

    一个好的点是,您可以以智能的方式创建本地目录结构副本(例如通过tarrsync;使用正确的选项,它也会保留所有处理某些病理的情况)。

  • 最后但同样重要的是使用类似Python 的 tarfile 模块 [2]创建你的 tar 文件,管理每种类型(以不同的方式管理文件和目录):勇敢一点!

相关内容