基本上我在 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,如果您有数不胜数文件。一个好的点是,您可以以智能的方式创建本地目录结构副本(例如通过
tar
或rsync
;使用正确的选项,它也会保留所有处理某些病理的情况)。最后但同样重要的是使用类似Python 的 tarfile 模块 [2]创建你的 tar 文件,管理每种类型(以不同的方式管理文件和目录):勇敢一点!