我目前正在使用以下 shell 命令将本地目录的内容复制到另一个目录:
cp -a /var/lib/jenkins /opt/jenkinsbackups
复制文件后,我会将复制的目录打包,然后将压缩的目录提交到源代码管理(Git、Bitbucket)。shell 命令如下所示:
cp -a /var/lib/jenkins /opt/jenkinsbackups
cd /opt/jenkinsbackups
tar czf jenkinsBackup_$(date +%Y%m%d-%H%M%S).tar.gz jenkins/
rm -rf /opt/jenkinsbackups/jenkins/
git add –all
git commit -m "Jenkins Automated Backup"
git push
Shell脚本的流程如下:
- 将 Jenkins 主目录复制到存储备份的目录。
- 导航到本地备份目录。
- 压缩 Jenkins 主目录的副本。
- 删除备份目录中未压缩的 Jenkins 主目录副本。
- Git 添加新压缩的备份。
- Git 提交更改(添加压缩的备份文件),提交消息为“Jenkins 自动备份”。
- Git push 到 Bitbucket 内存储库的主分支。
我正在使用的 Shell 单行程序:
cp -a /var/lib/jenkins /opt/jenkinsbackups && cd /opt/jenkinsbackups && tar czf jenkinsBackup_$(date +%Y%m%d-%H%M%S).tar.gz jenkins/ && rm -rf /opt/jenkinsbackups/jenkins/ && git add --all && git commit -m "Jenkins Automated Backup" && git push
我的问题是,如果在压缩目录之前我需要在复制中排除一些文件,我该如何修改 shell 命令来复制目录以排除这些文件?例如,不是复制所有文件:
cp -a /var/lib/jenkins /opt/jenkinsbackups
我需要排除目录中的文件夹.ssh/
并阻止其被复制,还需要保留目录中排除的原始文件。我想在复制目录之后、压缩目录之前,只需从目录的未压缩副本中删除文件即可。secrets
/var/lib/jenkins
/var/lib/jenkins
答案1
你可以像这样实现它:
tar
原始文件夹(不包括您不想备份的文件夹)tar czf jenkinsBackup_$(date +%Y%m%d-%H%M%S).tar.gz --exclude=dir_to_exclude *
cd
到目标文件夹- 将 tar 文件解压到目标文件夹中
- 备份 tar 文件
- 删除原始文件夹
为了删除原始文件夹(不包括某些文件夹/文件),您可以使用以下方法SO 问答
find . -type 'f' | grep -v "NameToExclude" | xargs rm
find . -type 'd' | grep -v "NameToExclude" | xargs rmdir
就您而言,如果您想排除两个目录(.ssh
和secret
),您可以使用:
find . -type 'f' | xargs rm
find . -type 'd' | grep -v ".ssh" | grep -v "secret"| xargs rmdir
--exclude=PATTERN exclude files, given as a PATTERN