Bash
Useful things to do with bash....
CONTENTS
Useful copy command for backing up
Don’t like backup programs (apart from rsync), but I do like cp. Here is an easy way of only copying over changed or new files:
cp -urvp /path/to/source/* /path/to/target/
What does it all do?
cp the copy command
-u update only new or changed files with a newer date
-r recursive to all sub directories
-v verbose, tell me what is happening
-p preserve file attributes
Multi-Part Archive using 7z and CLI
Sometimes simple is better. File Roller wouldn’t create a multipart no matter what i tried so I turned to cli for a solution, and found it with 7z. In this case I need to archive a 1.2GB iso file to a four part archive, with a volume size of 300mb. I didn’t delve into all the intricacies of what 7z can do, just the basics.
7z a -t7z -v300M output.7z input.iso
This produced four files:
output.7z.001
output.7z.002
output.7z.003
output.7z.004
Breakdown:
7z: calls the program
a: creates an archive
-t7z: selects 7z as the archive type (there are others)
-v300M: tells 7z to create 300mb archive parts
output and input files should be obvious. You could replace the input file with a directory!
man 7z
will give more detail on options
Run programs without sudo ?
Wouldn’t normally do this, or recommend it, but for occasional and considered use this is a useful tip. You need to run a program normally requiring sudo, but as a normal user. The usual way of fixing this is to put a line in /etc/sudoers, but you still need to type sudo. The problem I had was with a custom iso I have been putting together. Because my WM was openbox I was using a bash script with zenity to provide reboot and shutdown. This was all set up fine, but on installing the distro from the live cd, the installation needed to add a line to the bottom of /etc/sudoers, thereby negating my previously entered line.A long trawl through google provided an answer on ubuntuforums, which was to change the set uid bit for the shutdown command, so that all users could run shutdown with needing sudo. As you can see, doing this to a more important command would create security holes, but in this instance there is not much a hacker can do with shutdown, other than shutdown…AFAIK !! So here is the command I used:
sudo chmod a+s /sbin/shutdown
which gives the following permission:
645 -rwsr-sr-x 1 root root 46864 2011-01-22 01:58 shutdown
I edited out the sudo shutdown in my script and replaced it with /sbin/shutdown and all is well.
There is another way to do this, perhaps best done inside a bash script:
echo "yourpassword" | sudo -S "program"
This works well in most cases.
Run Once Only Bash Scripts
I am constantly amazed by what can be achieved with a simple bash script or two. I had a situation where I needed a script to run only once, and to not get any errors spat out at me from the cli. I needed a second script to call the run once script to go into rc.local, a file I didn’t want to mess with, so the call in rc.local would just be a quick file check after the first run. for me, the clever bit is that the script. I have to do the work can “move” (rename) itself once it has done its business, thereby ensuring it is not called upon again, but is still there if needed.
Here’s the script that does the work (called once.sh):
#!/bin/bash
Do the work
echo “I am now going to back myself up :)!”
sleep 2
mv once.sh once.sh.bak
echo file backed up
sleep 2
exit 0
The key line is the mv command, running on itself! I’ll remove the comments for the production setting
Here’s is the script that calls the one above (called runitonce.sh):
#!/bin/bash
if [ -f ~/once.sh ]
then
echo the file exists
sleep 2
~/once.sh
else
echo the file does not exist
sleep 2
fi
Basically, if once.sh is there, this script, runitonce.sh, runs once.sh, which when finished, renames itself. If once.sh is not there, the script just finishes. Subsequent runs of the script runitonce.sh called in rc.local just run through as there is no file to run. Simples 🙂