#!/bin/bash
################################################################################
# Filename: lsch.sh
# Version: 1.0
# Author Name: Marc Tessier
# Student Number: 040576114
# Course Name: UNIX/Linux Shell Programming
# Course Number: CST8129
# Lab Section: 010
# Assignment Number: 2
# Assignment Name: lsch
# Due Date: February 22, 2008
# Submission Date: February 22, 2008
# Professor's Name: Shawn Unger
# Purpose: Enhance the basic ls behaviour and add the ability to change
# the permissions of a file(s)/directory(ies) if desired by the user
################################################################################
Main () {
################################################################################
########################### Variable Declarations ##############################
################################################################################
declare FileSize
declare GroupName
declare UserName
declare FileName=$1
declare User_Per
declare Group_Per
declare Other_Per
declare File_Per
declare File_Dir
declare Mod_Date
declare User_Sel
declare OctalValue
declare bValid
declare User_Per1
declare User_Per2
declare User_Per3
declare FileDir
################################################################################
# Function Name: OctalConcert
# Purpose: Concert user input permissions to octal values
# Function Inputs: User_Per, Group_Per, Other_Per
# Function Outputs: OctalValue
# Version: 1.0
# Author Name: Marc Tessier
################################################################################
OctalConvert () {
OctalValue=($(echo $1 | tr "[:upper:]" "[:lower:]"))
case "$OctalValue" in
---)
OctalValue=0 ;;
--x)
OctalValue=1 ;;
-w-)
OctalValue=2 ;;
-wx)
OctalValue=3 ;;
r--)
OctalValue=4 ;;
r-x)
OctalValue=5 ;;
rw-)
OctalValue=6 ;;
rwx)
OctalValue=7 ;;
esac
}
################################################################################
################# File permission format for correct output ####################
################################################################################
File_Per=($(ls -ld "$FileName" | sed 's/^.//p'))
File_Per=($(echo $File_Per | cut -c 1-3):$(echo $File_Per | cut -c 4-6):$(echo $File_Per | cut -c 7-9))
File_Per=($(echo $File_Per | sed 's/r/Read/g'))
File_Per=($(echo $File_Per | sed 's/w/~Write/g'))
File_Per=($(echo $File_Per | sed 's/x/~Execute/g'))
File_Per=($(echo $File_Per | sed 's/-//g'))
################################################################################
########################## Variable Initialization #############################
################################################################################
FileDir=($(ls -ld "$FileName" | cut -c 1))
Mod_Date=$(ls -ld --time-style="+%B %d, %Y at %H:%M" "$FileName" | cut -d " " -f 6-10)
UserName=($(ls -ld "$FileName" | cut -d " " -f 3))
GroupName=($(ls -ld "$FileName" | cut -d " " -f 4))
FileSize=($(ls -ld "$FileName" | cut -d " " -f 5))
User_Per=($(ls -ld "$FileName" | cut -c 2-4))
Group_Per=($(ls -ld "$FileName" | cut -c 5-7))
Other_Per=($(ls -ld "$FileName" | cut -c 8-10))
User_Per1=($(ls -ld "$FileName" | cut -c 2-4))
Group_Per1=($(ls -ld "$FileName" | cut -c 5-7))
Other_Per1=($(ls -ld "$FileName" | cut -c 8-10))
################################################################################
########################## Basic Attributes Section ############################
################################################################################
if [[ $FileDir == "d" ]] # Check if file is a directory
then
echo "Directory: "$FileName"" # Output Directory filename
else
echo "File: "$FileName"" # Output file filename
fi
echo "User: $UserName" # Output Owner
echo "Group: $GroupName" # Output Group
if [[ $FileDir == "d" ]] # Check if file is a directory
then
echo "Size: N/A" # Size directory size to N/A
else
echo "Size: $FileSize bytes" # Output file size
fi
################################################################################
####################### Permission Attributes Section ##########################
################################################################################
echo -n "Permissions: User: "
echo $(echo $File_Per | sed 's/~/ and /g' | cut -d ":" -f 1) # Output User permissions
echo -n " Group: "
echo $(echo $File_Per | sed 's/~/ and /g' | cut -d ":" -f 2) # Output Group permissions
echo -n " Other: "
echo $(echo $File_Per | sed 's/~/ and /g' | cut -d ":" -f 3) # Output Other permissions
echo -n "Modification Date: "
echo $Mod_Date # Output Modification date
echo ""
################################################################################
########################## Permission Edit Section #############################
################################################################################
read -p "Would you like to change the permissions on this file [Y/N]
any other characters will be assume (N): " User_Sel # Get user selection
if [[ $User_Sel == "Y" || $User_Sel == "y" ]] # Check if YES
then
echo "Valid Permission are: RWX or an octal value, a dash (-) will"
echo " leave the permission unchange"
echo ""
############################### User Permissions ###############################
bValid=0 # Set valid flag to false
while (( $bValid==0 )) # While entry is not valid
do
read -p "New User Permissions (Currently $User_Per1): " User_Per
if ( echo $User_Per | grep "^[0-7]$" > /dev/null )
then # If Valid octal
bValid=1 # Set Valid flag to true
elif ( echo $User_Per | grep -i "^[r\-][w\-][x\-]$" > /dev/null )
then # If Valid Character
bValid=1 # Set Valid flag to true
elif [[ $User_Per == "-" ]]
then # If dont change permissions character
bValid=1 # Set Valid flag to true
else # Reprompt for valid entry
echo "Invalid Permissions, please use RWX or an octal value (0-7)"
fi
done
if [[ $User_Per == "-" ]] # If dont change permissions character
then
User_Per=($(ls -ld "$FileName" | cut -c 2-4))
OctalConvert $User_Per
User_Per=$OctalValue # Convert unchanged permission to octal
else
OctalConvert $User_Per
User_Per=$OctalValue # Convert new permission to octal
fi
############################### Group Permissions ###############################
bValid=0 # Set valid flag to false
while (( $bValid==0 )) # While entry is not valid
do
read -p "New Group Permissions (Currently $Group_Per1): " Group_Per
if ( echo $Group_Per | grep "^[0-7]$" > /dev/null )
then # If Valid Octal
bValid=1 # Set Valid flag to true
elif ( echo $Group_Per | grep -i "^[r\-][w\-][x\-]$" > /dev/null )
then # If Valid Character
bValid=1 # Set Valid flag to true
elif [[ $Group_Per == "-" ]]
then # If dont change permissions character
bValid=1 # Set Valid flag to true
else # Reprompt for valid entry
echo "Invalid Permissions, please use RWX or an octal value (0-7)"
fi
done
if [[ $Group_Per == "-" ]] # If dont change permissions character
then
Group_Per=($(ls -ld "$FileName" | cut -c 5-7))
OctalConvert $Group_Per
Group_Per=$OctalValue # Convert unchanged permissions to octal
else
OctalConvert $Group_Per
Group_Per=$OctalValue # Convert new permissions to octal
fi
############################### Other Permissions ###############################
bValid=0 # Set Valid Flag to flase
while (( $bValid==0 )) # While entry is not valid
do
read -p "New Other Permissions (Currently $Other_Per1): " Other_Per
if ( echo $Other_Per | grep "^[0-7]$" > /dev/null )
then # If Valid Octal
bValid=1 # Set Valid Flag to true
elif ( echo $Other_Per | grep -i "^[r\-][w\-][x\-]$" > /dev/null )
then # If Valid Character
bValid=1 # Set Valid Flag to true
elif [[ $Other_Per == "-" ]]
then # If dont change permissions character
bValid=1 # Set Valid flag to true
else # Reprompt for valid entry
echo "Invalid Permissions, please use RWX or an octal value (0-7)"
fi
done
if [[ $Other_Per == "-" ]] # If dont change permissions character
then
Other_Per=($(ls -ld "$FileName" | cut -c 8-10))
OctalConvert $Other_Per
Other_Per=$OctalValue # Convert unchanged permissions to octal
else
OctalConvert $Other_Per
Other_Per=$OctalValue # Convert new permissions to octal
fi
################################# chmod command #################################
File_Per=($(echo $User_Per $Group_Per $Other_Per | sed 's/ //g'))
chmod -R $File_Per "$FileName" # chmod new value filename
echo "New File Data:"
ls -ld "$FileName" # Output new attributes
fi
}
counter=0
counter_pointer=1
while [ $counter -lt $# ] # While there is still files
do
obj=`eval echo \\$$counter_pointer` # Make object = that file
Main "$obj" # Pass the object into main
(( counter=counter+1 )) # Increment
(( counter_pointer=counter_pointer+1 ))
done