home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / root / sbin / adddir < prev    next >
Text File  |  2006-11-29  |  2KB  |  77 lines

  1. #! /bin/bash
  2.  
  3. #
  4. # needs: chmod chown cp ln mktemp mv readlink rm
  5. #
  6.  
  7.  
  8. function read_dir {
  9.   local i
  10.  
  11.   for i in `( cd "$1" && echo .* * )` ; do
  12.     [ "$i" = . -o "$i" = .. ] && continue
  13.     [ -e "$1/$i" -o -L "$1/$i" ] && echo "$i"
  14.   done
  15. }
  16.  
  17.  
  18. function add_dir {
  19.   local src dst tmp i
  20.  
  21.   src="$1"
  22.   dst="$2"
  23.  
  24.   # echo "adddir $src $dst"
  25.  
  26.   for i in `read_dir $src` ; do
  27.     if [ -d "$src/$i" -a ! -L "$src/$i" ]; then
  28.       # add directory
  29.       # echo "  add dir $src/$i as $dst/$i"
  30.       if [ -d "$dst/$i" ] ; then
  31.         if [ -L "$dst/$i" ] ; then
  32.           tmp=`mktemp -d "$dst/adddir.XXXXXX"` || exit 2
  33.           chown --dereference --reference "$dst/$i" "$tmp" 2>/dev/null
  34.           chmod --reference "$dst/$i" "$tmp"
  35.           slink="`readlink $dst/$i`"
  36.           [ "${slink:0:1}" = / ] || slink="$dst/$slink"
  37.           add_dir "$slink" "$tmp"
  38.           rm -f "$dst/$i"
  39.           mv "$tmp" "$dst/$i"
  40.         fi
  41.         add_dir "$src/$i" "$dst/$i"
  42.       else
  43.         rm -f "$dst/$i"
  44.         ln -s "`( cd $src ; pwd )`/$i" "$dst/$i"
  45.       fi
  46.     else
  47.       # add non-directory
  48.       # echo "  add file $src/$i as $dst/$i"
  49.       if [ -d "$dst/$i" -a ! -L "$dst/$i" ] ; then
  50.         rm -rf "$dst/$i"
  51.       else
  52.         rm -f "$dst/$i"
  53.       fi
  54.       if [ -f "$src/$i" -a ! -L "$src/$i" ] ; then
  55.         ln -s "`( cd $src ; pwd )`/$i" "$dst/$i"
  56.       else
  57.         cp -a "$src/$i" "$dst/$i"
  58.       fi
  59.     fi
  60.   done
  61. }
  62.  
  63.  
  64. src="$1"
  65. dst="$2"
  66.  
  67. if [ ! \( -d "$src" -a -d "$dst" \) ] ; then
  68.   echo "Usage: adddir src_dir dst_dir"
  69.   echo "Adds (symlinks) everything that is in src_dir to dst_dir."
  70.   echo "Note: spaces in filenames are evil."
  71.   exit 1
  72. fi
  73.  
  74.  
  75. add_dir "$src" "$dst"
  76.  
  77.