A bash script to copy one file to multiple users

Dec 24, '03 12:30:00PM

Contributed by: nox

I had a co worker ask me if I knew how to copy one file into multiple users' User folders. At the High School he manages, he has atleast 3,000 users, and copying one file at a time was not an option. Of course I didnt know how to do this ... so I took on the challenge. After reading a few articles and a UNIX book, I came up with this script. Not bad for my first script.

I hope this helps someone. Any input is appreciated. I commented almost line by line for any other newbie to get started with scripting. This script will prompt the user for source filename, Users folder location, and destination (e.g. /Users/Library or /Users/Desktop). I put other features in the script; read the commented lines for explanation.


#! /bin/sh
# Alhambra Unified School District
# Manuel Plascencia 
# 10/25/2003
# Script : Copy 1 file to multiple users folders
#
# Reset Copy Counter
x=0
# Prompt for Filename and Location
echo -n "Source Filename and Location [/folder/filename.txt]: "
# Take input make it a string
read P
# If no input the take default source location
if [ "$P" = "" ]; then
P="/folder/filename.txt"
fi
# Filter Filename from $P and make a new string $N
N=`basename $P`
# Prompt for /Users/ folder location
echo -n "Where is your users folder [/Users/]: "
# Take input make it a string
read D
# If no input the take default user location
if [ "$D" = "" ]; then
G="/Users/"
D="/Users/*"
# if input then add to input /* to the end of user location
# adding /* makes a wildcard "any folder" in /user/ 
else
D=$G
D="$D/*"
fi
#
# Prompt for the destination folder 
echo -n "Where will this file be saved [/Library/Preferences/]: "
# Take input make it a string 
read L
# If no input the take default user location
if [ "$L" = "" ]; then
L="/Library/Preferences/"
fi
#
# Create Indeterminate Loop
for F in $D 
do
# Take Username from $F string 
U=`basename $F`
#
# Only if Directories is present filter
if [ -d $F ]
then
#
# copy $P to $F$L if no file exists -i prompts user for over write
# $P = Source file $F = user path 
cp -i $P $F$L
# File Copy Counter
x=`expr $x + 1`
#
# Set Owner and Group to file
# $U = user , staff = group , change group as needed
chown $U:staff $F$L$N
#
# Set File Permissions 
# 744 = 7 User: read-write-execute
#     = 4 Group: read 
#     = 4 Everyone: read
# Read = 4 , Execute = 1 , Write = 2 ,
# None = 0 , So Read+Execute+Write = 7 , Read = 4
# Set Permissions to file:
# User Read Write Execute ( rwx ) , 
# Group Read (r) , Everyone Read (r) 
chmod 744 $F$L$N
#
fi
# 
# End Loop
done
# Print Total Copied Files
echo
echo File copied $x times
echo
echo Creating Log File
echo
echo Writing to List.txt
# finds all files copied in $G | filters files with $N
# then writes file locations to List.txt
find $G -print | grep $N > List.txt
#
# Copy List.txt to Desktop
cp List.txt ~/Desktop/
# Launches TextEdit.app and opens List.txt
open ~/Desktop/List.txt
echo
echo Done
echo Enjoy

Comments (4)


Mac OS X Hints
http://hints.macworld.com/article.php?story=20031026135358452