Le nonidi 29 messidor, an CCXXIII, Andrew McGlashan a écrit : > Not sure if this is relevant enough, but I have a method to keep > "source" files -- in this case .forward files in a controlled directory; > if any of these differ from the target locations, then I save the target > location file with a dated version and copy in the controlled source > copy. This way I only get new files if they are changed, you could use > a similar method for the backups, that is only copying files to the > backup area if they are different to the current copy in the source area. If your files were all isolated in small hierarchies, I would have suggested to use Git instead, but with dotfiles in several home directories, that is not practical. And I realize you already considered that. On the other hand, I suspect rsync (with option -c) can detect the files that need updating in a simpler way. Also: > # cat fix_dot_forward.sh > #!/bin/sh > > PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin > > ( > wrk_dir=/backup/.forward-wrk > > for fix_name in user1 user2 user3 > do > HOME_DIR=$(grep ^${fix_name}: /etc/passwd|cut -d: -f6) "eval HOME_DIR=~$fix_name" is much simpler, more efficient, and would work with NIS- or LDAP-based user databases. > > md5_1=$(md5sum $HOME_DIR/.forward|cut -d\ -f1) > md5_2=$(md5sum $wrk_dir/$fix_name/.forward|cut -d\ -f1) You can write "md5="${md5%% *}" instead of using cut, one fork+exec less. And you can write "md5sum < file" to have a dash instead of the file name, and therefore not need to remove it. This is minor in this case, but in newly written code, avoid MD5, better use SHA-2. And of course (unless the files are large (unlikely for .forward) and on the same mechanical drive), cmp file1 file2 is much simpler. > if [ "$md5_1" != "$md5_2" ] > then > echo "The .forward file has changed for: "$fix_name > diff $HOME_DIR/.forward $wrk_dir/$fix_name/.forward|sed > 's/^/ /' > cp -p $HOME_DIR/.forward > $HOME_DIR/${fix_name}.forward.$(date +%Y%m%d%H%M) You do not check for errors. > cp -p $wrk_dir/$fix_name/.forward $HOME_DIR/ Dangerous: if .forward is not very small (think: handmade mailing-list), cp is not atomic. That means there is a small interval of time where the target .forward file will be only partial. To do that kind of thing reliably, you need to create a temporary file and rename it once it is complete. Just use rsync for the copy, it does that by default. > fi > done > )
Attachment:
signature.asc
Description: Digital signature