Search code examples
linuxbasharchive

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


How I can compress files in this scenario:

I have folder structure like this:

User1:

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

User2:

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

And I try now (need) to do backup like this:

Folders for backups per user:

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

And I need backup tar in user directory separately per website like this:

/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

I have script like this one to do half of this work:

#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

But if u see, i haven't how to do tar this for separately archives. In my half script I have done:

  1. Create folder structure for backup by datetime (/backup/users/day/hour-minutes)
  2. Create folder structure for backup by users names (/backup/users/day/hour-minutes/user1)

Thanks for all users who try to help me!


Solution

  • I will try to complete your script, but I can't debug it because your environment is hard to reproduce. It is better in the future that you provide a minimal reproducible example.

    #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
    

    I suppose there are no blanks inside the directory names website1, etc...

    I also replaced the deprecated backticks operators of your code by $(...).