File: installsh

package info (click to toggle)
chezscheme 10.0.0%2Bdfsg-5
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 36,908 kB
  • sloc: ansic: 24,192; sh: 1,132; makefile: 386; csh: 368; asm: 168
file content (79 lines) | stat: -rwxr-xr-x 2,055 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#! /bin/sh
if [ -x /bin/true ]; then TRUE=/bin/true;
elif [ -x /usr/bin/true ]; then TRUE=/usr/bin/true;
elif command -v true &> /dev/null; then TRUE=true;
else echo "Can't find /bin/true or /usr/bin/true and no true command" ; exit 1;
fi

while ${TRUE} ; do
  mkdirs=0
  ifdiff=0
  
  while [ $# -ge 0 ] ; do
    case $1 in
      -d) mkdirs=1 ;;
      -o) shift; owner=$1 ;;
      -g) shift; group=$1 ;;
      -m) shift; mode=$1 ;;
      --ifdiff) ifdiff=1 ;;
      -*) break 2 ;;
      *) break ;;
    esac
    shift
  done
  
  if [ $mkdirs -eq 1 ] && [ $ifdiff -eq 1 ] ; then
    break
  fi

  if [ $mkdirs -eq 1 ] ; then
    dirs=$*
  
    for dir in $dirs ; do
      stack=""
      while [ "$dir" != "/" -a "$dir" != "." -a "$dir" != ".." ] ; do
        stack="$dir $stack"
        dir=`dirname $dir`
      done

      for dir in $stack ; do
        if [ ! -d $dir ] ; then
          if mkdir $dir ; then
            if [ "$owner" != "" ] ; then chown $owner $dir ; fi
            if [ "$group" != "" ] ; then chgrp $group $dir ; fi
            if [ "$mode" != "" ] ; then chmod $mode $dir ; fi
          fi
        fi
      done
    done
  else
    nargs=$#
    if [ $nargs -lt 2 ] ; then break ; fi
    
    files=""
    while [ $# -ne 1 ] ; do
      files="$files $1"
      shift
    done
    dest=$1
    
    if [ ! -d $dest -a $nargs -ne 2 ] ; then break ; fi
  
    for file in $files ; do
      destfile=$dest
      if [ -d $destfile ] ; then destfile=$destfile/`basename $file` ; fi
      if [ $ifdiff -eq 1 ] && cmp -s $file $destfile || cp -f -p $file $destfile ; then
        if [ "$owner" != "" ] ; then chown $owner $destfile ; fi
        if [ "$group" != "" ] ; then chgrp $group $destfile ; fi
        if [ "$mode" != "" ] ; then chmod $mode $destfile ; fi
      fi
    done
  fi
  
  exit 0
done

echo "usage: $0 [ -o owner] [ -g group ] [ -m mode ] [ --ifdiff] file dest"
echo "       $0 [ -o owner] [ -g group ] [ -m mode ] [ --ifdiff] file file ... dir"
echo "       $0 -d [ -o owner] [ -g group ] [ -m mode ] dir dir ..."
exit 1