排除目录中的某些文件夹,使其不被复制到目录的副本中

排除目录中的某些文件夹,使其不被复制到目录的副本中

我目前正在使用以下 shell 命令将本地目录的内容复制到另一个目录:

cp -a /var/lib/jenkins /opt/jenkinsbackups

复制文件后,我会将复制的目录打包,然后将压缩的目录提交到源代码管理(Git、Bitbucket)。shell 命令如下所示:

  1. cp -a /var/lib/jenkins /opt/jenkinsbackups
  2. cd /opt/jenkinsbackups
  3. tar czf jenkinsBackup_$(date +%Y%m%d-%H%M%S).tar.gz jenkins/
  4. rm -rf /opt/jenkinsbackups/jenkins/
  5. git add –all
  6. git commit -m "Jenkins Automated Backup"
  7. git push

Shell脚本的流程如下:

  1. 将 Jenkins 主目录复制到存储备份的目录。
  2. 导航到本地备份目录。
  3. 压缩 Jenkins 主目录的副本。
  4. 删除备份目录中未压缩的 Jenkins 主目录副本。
  5. Git 添加新压缩的备份。
  6. Git 提交更改(添加压缩的备份文件),提交消息为“Jenkins 自动备份”。
  7. 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

就您而言,如果您想排除两个目录(.sshsecret),您可以使用:

find . -type 'f' | xargs rm 
find . -type 'd' | grep -v ".ssh" | grep -v "secret"| xargs rmdir

曼塔尔

--exclude=PATTERN
    exclude files, given as a PATTERN

相关内容