Solved

script

Posted on 1998-12-14
9
312 Views
Last Modified: 2010-04-20
I am trying to backup my system..
I started out by trying to write a script like this:

***
#!/bin/sh

DIR_LIST=`cat /etc/backup.list`
LAST_BU_FILENAME=/etc/.backupfull
FILENAME=`date +%Y%m%d.incr.tgz`
PATHNAME=/home/backup/

find $DIR_LIST -newer $LAST_BU_FILENAME -type f -print > /tmp/filez.list

sed 's/ /\\ /g' /tmp/filez.list >/tmp/filez2.list
LIST=`cat /tmp/filez2.list`

#create the initial tar file.. then we'll append to this
tar cvf fred.tar /tmp/filez2.list

for FILETOARCHIVE in $LIST
do

tar rvf fred.tar $FILETOARCHIVE

done

***

This would work if it wasn't for windows weenies. Windows weenies use my linux system as a file server and hence have whitespace in their files (and directories)

But it isn't the tarring that's the problem since i can do this:

tar rvf fred.tar /home/fred/hello\ world/smeg.doc

and it works no problems..
so my problem is in the for loop declaration
it is giving the wrong names to the tar line

hence i need a way to send a complete line (spaces or no spaces) from $LIST to the for expression without it thinking I am specifying a new variable because of the space

Let me try and explain a bit better:

the filez2.list may look like this:
/home/tig/rhosts
/home/tig/hello\ world.doc

the for loop does this
sends /home/tig/rhosts to tar
sends /home/tig/hello to tar
sends world.doc to tar

which is wrong!
(i'm pretty sure what i say is correct)

the "for" expression (as soon as it hits a space) executes the loop.

basically what i need is this:
some way to do a find on my system for updated files (as above) and direct that output into tar

can i do something like this:

find $DIR_LIST -newer $LAST_BU_FILENAME -type f -print | tar rvf fred.tar -

??????

how can this problem be solved?

or can i somehow work around the for loop problem..
0
Comment
Question by:wehttam
  • 3
  • 3
  • 3
9 Comments
 
LVL 51

Expert Comment

by:ahoffmann
ID: 1638834
sed 's/ /</g' /tmp/filez.list >/tmp/filez2.list

for FILETOARCHIVE in `cat /tmp/filez2.lst`; do
   filename="`echo "\"$FILETOARCHIVE"\" | sed -e 's/</\ /g'`"
   tar rvf fred.tar $FILETOARCHIVE
done

0
 
LVL 1

Expert Comment

by:zblaxell
ID: 1638835
Wow...not only is it complicated, it's beyond repair...

    #!/bin/sh

    DIR_LIST=`cat /etc/backup.list`
    LAST_BU_FILENAME=/etc/.backupfull
    FILENAME=`date +%Y%m%d.incr.tgz`
    PATHNAME=/home/backup/

    echo -ne '/tmp/filez2.list\000' > /tmp/filez2.list
    find $DIR_LIST -newer $LAST_BU_FILENAME -type f -print0 >> /tmp/filez2.list
    cpio -ov0Htar < /tmp/filez2.list > fred.tar

This problem is much more appropriately solved in perl than a shell script.  Shell scripts have chronic character quoting problems (not to mention security problems) that make doing anything like this with a for loop in a shell a guaranteed disaster.  In addition to handling spaces correctly (which you aren't doing...you need "$VARIABLE" instead of $VARIABLE everywhere in your shell script), you have to handle newlines and \377's if you want to handle the entire Unix filename character set.
0
 

Author Comment

by:wehttam
ID: 1638836
Ahoffmann,
you solution failed to work. It did not successfully pick up files/directories with spaces.
I appreciate your help..

zblaxell,
your solution worked correctly.
please answer to receive your points


0
Windows Server 2016: All you need to know

Learn about Hyper-V features that increase functionality and usability of Microsoft Windows Server 2016. Also, throughout this eBook, you’ll find some basic PowerShell examples that will help you leverage the scripts in your environments!

 
LVL 51

Expert Comment

by:ahoffmann
ID: 1638837
as zblaxell said, anything else than [a-zA-Z0-9_+,.-;:_=%@]  in a shell  *may*  be  "a guaranteed disaster"  but *must not* be.
Probaly my solution just misses the quotes in the tar command
(as zblaxell said), sorry.
I also thaught of posting a solution which did tar all files at once, and not one by one (see zblaxell's comment), 'cause there aren't any prblems with any character in filenames as long as the name is not parsed by the shell itself.
0
 

Author Comment

by:wehttam
ID: 1638838
>I also thaught of posting a solution which did tar all files at once, and not one by one
>(see zblaxell's comment), 'cause there aren't any prblems with any character in
>filenames as long as the name is not parsed by the shell itself.

I am aware that tar won't have a problem with this as initially i was using tar with the -N option to recursively pick up any new files in any directory. This worked fine except for the fact that tar's -N option is a very poor implementation since it seems to focus on directory dates instead of individual file dates. Hence I needed to use the 'find' command and direct it into tar. But this is not an option for tar if the file/directory has whitespace.. although later on i discovered tar can grab whitespace.. but the for loop was causing the problem.
But i explained all this in my question above.

Anyways, I appreciate your help.
0
 
LVL 1

Accepted Solution

by:
zblaxell earned 200 total points
ID: 1638839
"please answer to receive your points"

OK, here it is...
0
 
LVL 51

Expert Comment

by:ahoffmann
ID: 1638840
ok, how about this (didn't chech tar options):

find $DIR_LIST -newer $LAST_BU_FILENAME -type f -exec tar rvf fred.tar {} \;

(it's a single line, probably wrapped by e-e).
0
 
LVL 1

Expert Comment

by:zblaxell
ID: 1638841
Or:

find $DIR_LIST -newer $LAST_BU_FILENAME -type f -print0 | xargs -0 tar rvf fred.tar
0
 

Author Comment

by:wehttam
ID: 1638842
thanks guys
i'll try em out

0

Featured Post

Free Tool: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Error Message during CentOS 7 Minimal Install 3 58
Linux boot cd to do hardware report on PC? 3 57
Backup Raspberri Pi over the netowrk to a Windows Share 5 52
linux 13 75
Daily system administration tasks often require administrators to connect remote systems. But allowing these remote systems to accept passwords makes these systems vulnerable to the risk of brute-force password guessing attacks. Furthermore there ar…
Using 'screen' for session sharing, The Simple Edition Step 1: user starts session with command: screen Step 2: other user (logged in with same user account) connects with command: screen -x Done. Both users are connected to the same CLI sessio…
Learn several ways to interact with files and get file information from the bash shell. ls lists the contents of a directory: Using the -a flag displays hidden files: Using the -l flag formats the output in a long list: The file command gives us mor…
Learn how to get help with Linux/Unix bash shell commands. Use help to read help documents for built in bash shell commands.: Use man to interface with the online reference manuals for shell commands.: Use man to search man pages for unknown command…

856 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question