如何将多个文件夹分别压缩到另一个文件夹和tar.gz

How to compress multiple folders to separetly another folders and tar.gz

在这种情况下如何压缩文件:

我有这样的文件夹结构:

用户 1:

/home/user1/websites/website1
/home/user1/websites/website2

用户 2:

/home/user2/websites/website1
/home/user2/websites/website2
/home/user2/websites/website3

我现在尝试(需要)像这样进行备份:

每个用户的备份文件夹数:

/backup/date/websites/user1/
/backup/date/websites/user1/

我需要像这样在每个网站的用户目录中单独备份 tar:

/backup/date/websites/user1/website1.tar.gz
/backup/date/websites/user1/website2.tar.gz
/backup/date/websites/user2/website1.tar.gz
/backup/date/websites/user2/website2.tar.gz
/backup/date/websites/user2/website3.tar.gz

我有这样的脚本来完成一半的工作:

#VARIABLES
BKP_DATE=`date +"%F"`
BKP_DATETIME=`date +"%H-%M"`

#BACKUPS FOLDERS
BKP_DEST=/backup/users
BKP_DEST_DATE=$BKP_DEST/$BKP_DATE
BKP_DEST_TIME=$BKP_DEST_DATE/$BKP_DATETIME
BACKUP_DIR=$BKP_DEST_TIME

#NUMBER OF DAYS TO KEEP ARCHIVES IN BACKUP DIRECTORY
KEEP_DAYS=7

#Create folders
mkdir -p $BKP_DEST_DATE
mkdir -p $BKP_DEST_TIME
mkdir -p $BACKUP_DIR

#DELETE FILES OLDER THAN {*} DAYS IN BACKUP SERVER DIRECTORY
#echo 'Deleting backup folder older than '${KEEP_DAYS}' days'
find $BKP_DEST/* -type d -ctime +${KEEP_DAYS} -exec rm -rf {} \;

#Do backups
#List only names available users data directories
usersdirectories=`cd /home && find * -maxdepth 0 -type d | grep -Ev "(tmp|root)"`

#Creating directories per user name
for i in $usersdirectories; do
  mkdir -p $BACKUP_DIR/$i/websites
done

但是如果你看到了,我不知道如何为单独的档案做 tar。在我的半脚本中我做了:

  1. 按日期时间创建备份文件夹结构(/backup/users/day/hour-minutes)
  2. 按用户名创建备份文件夹结构(/backup/users/day/hour-minutes/user1)

感谢所有帮助我的用户!

我希望我可以发表评论以寻求更多说明,但我会尽力帮助你。

#!/bin/bash

# example for user1
archive_path=/backup/data/websites/user1
file_path=/home/user1/websites/*

for i in $file_path
do
  tar czf $archive_path/$(basename $i).tar.gz $file_path
done

我会尝试完成你的脚本,但我无法调试它,因为你的环境很难重现。最好在将来提供一个最小的可重现示例。

#VARIABLES
BKP_DATE=$(date +"%F")
BKP_DATETIME=$(date +"%H-%M")

#BACKUPS FOLDERS
BKP_DEST=/backup/users
BKP_DEST_DATE=$BKP_DEST/$BKP_DATE
BKP_DEST_TIME=$BKP_DEST_DATE/$BKP_DATETIME
BACKUP_DIR=$BKP_DEST_TIME

#NUMBER OF DAYS TO KEEP ARCHIVES IN BACKUP DIRECTORY
KEEP_DAYS=7

#Create folders
mkdir -p $BKP_DEST_DATE
mkdir -p $BKP_DEST_TIME
mkdir -p $BACKUP_DIR

#DELETE FILES OLDER THAN {*} DAYS IN BACKUP SERVER DIRECTORY
#echo 'Deleting backup folder older than '${KEEP_DAYS}' days'
find $BKP_DEST/* -type d -ctime +${KEEP_DAYS} -exec rm -rf {} \;

#Do backups
#List only names available users data directories
usersdirectories=$(cd /home && find * -maxdepth 0 -type d | grep -Ev "(tmp|root)")

#Creating directories per user name
for i in $usersdirectories; do
  for w in $(/home/$i/websites/*); do
    ws=$(basename $w)
    mkdir -p $BACKUP_DIR/$i/websites/$ws
    tar -czvf $BACKUP_DIR/$i/websites/$ws.tar.gz /home/$i/websites/$ws
  done
done

我想目录名称 website1 等中没有空格...

我还将代码中已弃用的反引号运算符替换为 $(...)

好的,经过小的修复。 Pierre 的版本现在可以使用。如果你愿意,你可以根据自己的需要进行调整。

#VARIABLES
BKP_DATE=$(date +"%F")
BKP_DATETIME=$(date +"%H-%M")

#BACKUPS FOLDERS
BKP_DEST=/backup
BKP_DEST_DATE=$BKP_DEST/$BKP_DATE
BKP_DEST_TIME=$BKP_DEST_DATE/$BKP_DATETIME
BACKUP_DIR=$BKP_DEST_TIME

#NUMBER OF DAYS TO KEEP ARCHIVES IN BACKUP DIRECTORY
KEEP_DAYS=7

#Create folders
mkdir -p $BKP_DEST_DATE
mkdir -p $BKP_DEST_TIME
mkdir -p $BACKUP_DIR

#DELETE FILES OLDER THAN {*} DAYS IN BACKUP SERVER DIRECTORY
#echo 'Deleting backup folder older than '${KEEP_DAYS}' days'
find $BKP_DEST/* -type d -ctime +${KEEP_DAYS} -exec rm -rf {} \;

#Do backups
#List only names available users data directories
usersdirectories=$(cd /home/user && find * -maxdepth 0 -type d | grep -Ev "(tmp|root)")

#Creating directories per user name
for i in $usersdirectories; do
  for w in /home/user/$i/*; do
    #echo ok
    ws=$(basename $w)
    echo mkdir -p $BACKUP_DIR/$i
    echo tar -czvf $BACKUP_DIR/$i/$ws.tar.gz /home/user/$i/$ws
  done
done