79 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable file
		
	
	
	
	
| #! /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
 | 
