Sample Scripts
Script using if
#!/bin/bash echo -e "This program adds entries to a family database file . \n" echo -e "Would you like to add an entry to the family database file? \n" read ANSWER1 if [ $ANSWER1 = "y" -o $ANSWER1 = "Y" ] then echo -e "Please enter the name of the family member --> \c" read NAME echo -e "Please enter the family menber's relation to you (i.e. mother) -->\c" read RELATION echo -e "Please enter the family member's telephone number -->\c" read PHONE echo -e "$NAME\t$RELATION\t$PHONE">>database fi echo -e "Would you like to search an entry in the family databae file?\n" read ANSWER2 if [ $ANSWER2="y" -o $ANSWER2="Y" ] then echo -e "What word would you like to look for? -->\c" read WORD grep "$WORD" database fi
Script using CASE
#!/bin/bash while true do clear echo -e "What would you like to do? Add and entry (a) Search an entry (s) Quit (q) Enter your choice (a/s/q)-->\c" read ANSWER case $ANSWER in a|A) echo -e "Please enter the name of the family member -->\c" read NAME echo -e "Please enter the family member's relation to you (i.e. mother) -->\c" read RELATION echo -e "Please enter the family member's telephone number -->\c" read PHONE echo -e "$NAME\t$RELATION\t$PHONE" >>database ;; s|S) echo -e "What word would you like to look for?-->\c" read WORD grep "$WORD" database sleep 4 ;; q|Q) exit ;; *) echo "You must enter either the letter a or s" sleep 4 ;; esac done
While Loop
#!/bin/bash index=1 while [ $index -lt 6 ] do echo "hello ${index}" ((index++)) done
while [ "$correct" != "y" ] do read -p "enter your name:" name read -p "is ${name} matched" correct done
Files in folder to html
echo "print directory conents to file" echo -e "what is the title---->\c" read title sleep 1 echo -e '<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>' > index.html sleep 2 echo -e $title >> index.html sleep 2 echo '</title>' >> index.html sleep 2 echo -e '</head> <body>' >> index.html sleep 2 echo '<h1>' >> index.html sleep 2 echo $title >> index.html sleep 2 echo '</h1>' >> index.html sleep 2 ls | awk -F: '{print "<p> <a href=\""$1 "\">"$1 "</a></p>"}' >> index.html sleep 2 echo -e '</body></html' >> index.html
Reading a file, line by line
read -p "Enter Filename " FILENAME grep [rR]obert $FILENAME | while read LINE do echo "<p> ${LINE}</p>" done
Send Find and replace to a separate file
read -p "Enter Filename " FILENAME sed 's/[rR]obert'xor/g' > two.txt sleep 2 #clear output file echo " Cleaned file " > three.txt grep -n -i xor two.txt | while read LINE do echo "<p> ${LINE} </p>" >> three.txt done clear echo "--------- two.txt -------------" cat two.txt echo "" echo "------three.txt ----------------" cat three.txt
Backup MYSQL Database
#!/bin/bash mdate=`date +%F` echo "================ backing up databasename database ==============" mysqldump -u username -ppassword databasename > databasename-$mdate.sql sleep 5 echo "================ backing up databasename ====================" mysqldump -u username -ppassword databasename > databasename-$mdate.sql sleep 5 echo "=============== Backing up databasename database =============" mysqldump -u username -ppassword databasename > databasename-$mdate.sql sleep 5 echo " ========= done =========" ls *.sql > /var/www/sqlfiles.txt sleep 5 # calls another script which does the actual backup to amazon cd /var/dirtoscripts/ ./bksql.sh
Backup HTML Directory
#!/bin/bash bkdate = `date +%F` cd /var/www/ sleep 1 filename=outwaterphotogallery-$bkdate.zip #zip html folder zip -r $filename /var/www/html sleep 5 if [ "$filename" ]; then aws s3 cp --region us-east-1 $filename s3://websitebackup-opi/web/ fi sleep 4 count=`ls -l *.zip | wc -l 2> /dev/null` if [ $count -ge 1 ]; then mv *.zip /var/www/backups/web/ fi
Script that backs up to Amazon S3
#!/bin/bash echo "--------- backing up to s3 --------------" set -e if [ -f sqlfiles.txt ]; then while read line do aws s3 cp --region us-east-1 $line s3://bucketname done < sqlfiles.txt echo "++++++++++= Done =+++++++++++++++" else echo " XXXXXXXXXXX File Does not exist XXXXXXX" fi cd /var/www/dirtoscripts/ # call script that counts the num of sql files in dir and move them to an archive folder ./cleanupscript
Find files and rsync them to a dir
find . -type f -name '*.jpg' -exec rsync -zavhP {} /dirctorytocopyto/ \;
Find Multiple filenames
find . -type f \( -name "*.nef" -o -name "*.jpg" -o -name "*.tif" \)
RSYNC copy directories with spaces
find . -type f -name '*177*' -exec rsync -zavP {} "/var/tmp/my dir" \;
Count Files in Directory
cd /var/www/
count=`ls-l *.sh | wc -l 2> /dev/null` if [ $count -ge 1 ]; then mv *.sql /var/www/backups/dirname fi
Find and delete files with certain names
find -type -f -name '*one*' -exec rm {} \;
Find specific files and copy them to another folder
find -type f -name "*app1*" -exec cp {} /var/www/test/ \;
Using rename command
If its not installed in MacOS, use brew to install it
rename 's/dem/rob/g' * jpg
Will change dem and replace it with rob /g is global which will replace all occurrence of dem in the file name
rename 's/\+/_/g' *.tif
use the \ escape character with the + sign
rename '/.jpg/.tif/' *.jpg
Change jpg extension to tif
Deleting part of a filename
rename 's/dem//' *.jpg
Searching with Groupings
rename 's/(dem|rob)ng/bac/' *.jpg
The central expression of this rename command will search for strings within filenames that have the character sequence “stri” or “stra” where those sequences are immediately followed by “ng”. In other words, our search term is going to look for “string” and “strang”. The substitution term is “bang”.
Example: demng.jpg, robmg.jpg
Changing case of filename rename 'y/a-z/A-Z/' *.jpg
Find files x days old and delete them
#!/bin/bash find /path/to/files/ -type f -name '*.jpg' -mtime +10 -exec mv {} /path/to/archive/ \; find /path/to/archive/ -type f -name '*.jpg' -mtime +30 -exec rm {} \;
- First part is the path where your files are located. Don’t use wildcard * if you have a lot of files because you will get Argument list too long error.
- Second part -type is the file type f stands for files
- Third part -name is limiting *,jpg files
- Fourth part -mtime gets how many days the files older than will be listed. +30 is for files older then 30 days.
- Fifth part -exec executes a command. In this case mv is the command, {} gets the filelist, path where to move the files and \; closes the command
Find files over a certain size
$ find . -type f -size -4G
You can use size switch for other formats, such as
- `c’ for bytes
- ‘w’ for two-byte words
- `k’ for Kilobytes
- `M’ for Megabytes
- `G’ for Gigabytes
Find Directory sizes
du -h --max-depth=2 | sort -hr