LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Programming (http://www.linuxquestions.org/questions/programming-9/)
-   -   Bash script - how to use output from diff and find in context with cpio (http://www.linuxquestions.org/questions/programming-9/bash-script-how-to-use-output-from-diff-and-find-in-context-with-cpio-699285/)

Mogget 01-23-2009 12:15 AM

Bash script - how to use output from diff and find in context with cpio
 
Hey.

What i want to do is use the output from find, diff and then pipe it to cpio. Somewhat like this

Code:

find . -print > homefolderMonday
find . -print > homefolderTuesday
diff homefolderMonday homefolderTuesday | cpio --create --format=newc > /mnt/backup/backup.cpio

Problem is that the output from diff can't be piped directly since the output contains other things in addition to the folder and file changes.

example:

2684a2685
> ./.kde/share/apps/kopete/msnpictures/someuserblabla-com.png

So how do i remove the "2684a2685" and ">" part from diff output? I'm also open for other ways to do this so if you have sugestions tell me.

I've made a basic backup utility that backups every users /home folders to a specified mounted partition. It works somewhat like this. PS, this is not the complete code. I can provide it if necesary.

Code:

#!/bin/bash

# What user should be backed up?
USER=Mogget
# Users home directory
USERHOME=/home/$USER
# Where to backup to
BACKUPDIR=/mnt/backup
# What date is it today?
DATE=`date -u +%m%d%y`
# Create users directory in backup directory?
CRTUSERDIR=0
# Create todays directory in users backup directory?
CRTUSERTODAY=0
# If 0 the backup process will be aborted after directory checking
DOBACKUP=0

if [ -d $BACKUPDIR/$USER ]; then
    echo "$BACKUPDIR/$USER exist."
else
    echo "Creating $BACKUPDIR/$USER."
    mkdir $BACKUPDIR/$USER
fi

if [ -d $BACKUPDIR/$USER/$DATE.bak
    echo "Backup already been done, exiting backup script."
    DOBACKUP=1
else
    echo "Creating $BACKUPDIR/$USER/$DATE.bak."
    mkdir $BACKUPDIR/$USER/$DATE.bak
fi

if [ $DOBACKUP = "0" ]; then
    cd $USERHOME
    echo "Making a list of $USERHOME."
    find . -print > $BACKUPDIR/$USER/$DATE.bak/$DATE.list
    echo "Using $BACKUPDIR/$USER/$DATE.bak/$DATE.list to backup with cpio."
    cat $BACKUPDIR/$USER/$DATE.bak/$DATE.list | cpio --create --format=newc > $BACKUPDIR/$USER/$DATE.bak/$DATE-backup.cpio
    echo "Updating last update date in $BACKUPDIR/$USER/.last-backup."
    date -u +%m%d%y > $BACKUPDIR/$USER/.last-backup
    echo "Done backing up for today."
fi

The point of $BACKUPDIR/$USER/.last-backup is so that the script can retrieve the last backup list made so we can diff todays list and last backups list and run it through cpio

Any help and pointers will be gladly taken sorounding different ways to do this.

Thanks for the help in advance.

David the H. 01-23-2009 04:48 AM

You can pipe the output through egrep, using a regex to match only the filenames. Something like:

Code:

diff homefolderMonday homefolderTuesday | egrep -o "\./.+$" | cpio --create --format=newc > /mnt/backup/backup.cpio
This assumes the file names all start with ./ and aren't followed by anything else on the line.

Edit: It seems that "diff -n" will print the lines without the leading > character, so you could make the grep expression even simpler; something like egrep -o "^\." (matches any line starting with a period) would probably be all you need, to filter out non-file lines.

gnashley 01-23-2009 07:19 AM

I think diff is simply the wrong tool for the job. Either comm or cmp would probably be more suited, but there are surely still better ways to compare the contents of two directories, such as dircomp:
http://sourceforge.net/projects/dircomp

theNbomr 01-23-2009 08:16 AM

diff, the way you are trying to use it, is going to show you files that have been removed, and these are going to be difficult to backup. find, on the other hand, should be able to directly report those files which are new or modified in the most recent minutes or days:
Code:

find . -ctime -1 -print
prints the full filespec of all files created or modified in the last day.

--- rod.

Mogget 01-23-2009 10:38 AM

Thank you for the suggestions.
I knew that diff would output folders that has been removed to so that's a blunder from my side.

I'll look closer into the find -ctime function since that would make my script easier to work with. Thank you for your time.


All times are GMT -5. The time now is 02:40 AM.