查找并压缩多个文件扩展名,同时保留文件夹结构

查找并压缩多个文件扩展名,同时保留文件夹结构

乌班图16.04

我想备份所有 .txt、.cfg 和 .ini 文件,同时将其文件夹结构保留为备份文件夹中的 zip 文件。

我知道有一种更简单的方法来完成整个操作,但这就是我所拥有的。

#!/bin/bash

wdir="/home/files"
backup_dir="/home/files/backup"
allcfg=$(find suan -name '*.cfg')
alltxt=$(find suan -name '*.txt')
allini=$(find suan -name '*.ini')
timeStamp="$(date +%Y--%b-%d--%k:%M--%P)"
backupfilename="${backup_dir}/Backup-${timeStamp}.zip"

#-- set some arrays ...
backupfiles=( "$allcfg" "$alltxt" "$allini" )

cd "$wdir"
zip -r "$backupfilename" "$backupfiles"

因此,我可以看到它归档的文件的良好输出,但是当它到达压缩部分时,它会出错。

zip error: Nothing to do! (try: zip -r /home/files/backup/Backup-2018--Jul-04--21:37--pm.zip . -i suan/cfg/360controller.cfg

但这也行不通。

答案1

-r这就是递归选项的工作原理7z,它是递归模式搜索。

7z a -r "$backupfilename" \*.ini \*.cfg \*.txt

7z创建 zip 文件就好了。

find如果你没有 7zip,你也可以使用 multi-arg 选项,

find suan \( -name \*.cfg -o -name \*.txt -o -name \*.ini \) \
    -exec zip -r "$backupfilename" {} +

答案2

使用findzip

find "$wdir" -type f '(' -name '*.cfg' -o -name '*.txt' -o -name '*.ini' ')' \
    -exec zip -r "$backupfilename" {} +

或者,您可能希望先将脚本cd放入"$wdir",然后.find命令中使用,具体取决于您希望在存档中保存的路径。

这将找到所有相关文件并将它们存档在您的备份文件中。

或者bash,如果没有数千个文件:

set -s globstar nullglob dotglob
cd "$wdir" && zip -r "$backupfilename" **/*.ini **/*.cfg **/*.txt

此处设置的 shell 选项启用**glob(glob 路径名),使未扩展的 glob 扩展为空字符串并使 glob 与隐藏文件匹配。

相关内容