Advertisement
If you have a new account but are having problems posting or verifying your account, please email us on hello@boards.ie for help. Thanks :)
Hello all! Please ensure that you are posting a new thread or question in the appropriate forum. The Feedback forum is overwhelmed with questions that are having to be moved elsewhere. If you need help to verify your account contact hello@boards.ie
Hi all,
Vanilla are planning an update to the site on April 24th (next Wednesday). It is a major PHP8 update which is expected to boost performance across the site. The site will be down from 7pm and it is expected to take about an hour to complete. We appreciate your patience during the update.
Thanks all.

Stick up your best shell scripts

13

Comments

  • Registered Users Posts: 545 ✭✭✭ravydavygravy


    Cheating slightly - its perl, not bash.... but maybe someone will find it useful. In the sys admin line of work, you spend a lot of time watching logs - so this script colorises the output to make it easy to notice errors, exceptions, whatever...

    You could use it like so: tail -f /var/log/mylogfile | color.pl
    #!/usr/bin/perl
    
    use Term::ANSIColor qw(:constants);
    use Switch;
    
    while( defined ($line = <STDIN>) )
    {
        switch ($line)
        {
            ## Obviously, add your own regular expressions and colors here.... 
            case /Exception/           { print YELLOW, ON_RED,    "$line", RESET; }
            case /[Ee]rror/            { print YELLOW, ON_BLACK,  "$line", RESET; }
            case /Success/             { print GREEN, ON_BLACK,   "$line", RESET; }
            else                       { print WHITE, ON_BLACK    "$line", RESET; }
        }
    }
    

    If you need something more configurable, try http://kassiopeia.juls.savba.sk/~garabik/software/grc.html


  • Registered Users Posts: 1,038 ✭✭✭rob1891


    betafrog wrote: »
    Don;t forget the ubiquitous
    :(){ :|:&};:
    

    Copy and past into a terminal and watch the ensuing fun :p
    It is like that big red button that says do not press ;-)

    Doesn't end badly though. For the umpteenth time I was left with a load of VIM .swp files to go through so I finally got around to doing a little script to check them automatically ...
    #!/bin/bash
    
    TMPDIR=/tmp
    
    for i in .*.swp
    do
        FILE=`echo $i | sed -r 's/^\.(.+)\.swp/\1/'` #strip to get original name
    
        vi -e -s -r $FILE -c "wq! $TMPDIR/$FILE.recovered" #write the recovered file
    
    
        diff -u $FILE $TMPDIR/$FILE.recovered
    
        if [ $? -eq 0 ]; then
            rm $TMPDIR/$FILE.recovered
            rm $i
        else
            echo "See $TMPDIR/$FILE.recovered and delete $i manually"
        fi
    done
    


  • Registered Users Posts: 545 ✭✭✭ravydavygravy


    Wife about to go into labour? Unsure how to help? What not write a bash script to time her contractions... (seemed like a good idea at the time...)
    #!/bin/sh
    
    STIME=-1
    COUNTER=0
    
    ## Set these threshold parameters to whatever you want...
    
    C_THRESH=2     ## More than 2 contractions...
    P_THRESH=600   ## less than 10 mins apart...
    D_THRESH=30    ## lasting at least 60 seconds each...
    
    echo
    echo "###################################################################################"
    echo "##              L a b o u r   C o n t r a c t i o n   T i m e r                  ##"
    echo "###################################################################################"
    echo
    
    while [ 1 == 1 ]
    do
        echo -n "####: Press any key to start next contraction..."
        read
    
        ### OK, lets go...
    
        if [ $STIME -eq -1 ]
        then
            OTIME=`date +%s`
        else
            OTIME=$STIME
        fi
    
        PTIME=`date +%H:%M:%S`
        STIME=`date +%s`
    
        echo -n "####: Started - press any key to end..."
        read
    
        ## Work out details
    
        ETIME=`date +%s`
    
        DURATION=`expr $ETIME - $STIME`
        PERIOD=`expr $STIME - $OTIME`
    
        echo "INFO: Contraction Over - started at $PTIME ($PERIOD secs since last time) - lasted for $DURATION seconds"
    
        if [ $PERIOD -lt $P_THRESH -a $DURATION -gt $D_THRESH ]
        then
            COUNTER=`expr $COUNTER + 1`
    
            if [ $COUNTER -gt $C_THRESH ]
            then 
                echo "CRIT: Consistent frequency and duration *strongly* suggest hospital visit...."
            else
                echo "WARN: Frequency and duration suggest possible hospital visit...."
            fi
        else
            COUNTER=0
        fi
    done
    


  • Registered Users Posts: 2,762 ✭✭✭Sheeps


    Wife about to go into labour? Unsure how to help? What not write a bash script to time her contractions... (seemed like a good idea at the time...)
    #!/bin/sh
    
    STIME=-1
    COUNTER=0
    
    ## Set these threshold parameters to whatever you want...
    
    C_THRESH=2     ## More than 2 contractions...
    P_THRESH=600   ## less than 10 mins apart...
    D_THRESH=30    ## lasting at least 60 seconds each...
    
    echo
    echo "###################################################################################"
    echo "##              L a b o u r   C o n t r a c t i o n   T i m e r                  ##"
    echo "###################################################################################"
    echo
    
    while [ 1 == 1 ]
    do
        echo -n "####: Press any key to start next contraction..."
        read
    
        ### OK, lets go...
    
        if [ $STIME -eq -1 ]
        then
            OTIME=`date +%s`
        else
            OTIME=$STIME
        fi
    
        PTIME=`date +%H:%M:%S`
        STIME=`date +%s`
    
        echo -n "####: Started - press any key to end..."
        read
    
        ## Work out details
    
        ETIME=`date +%s`
    
        DURATION=`expr $ETIME - $STIME`
        PERIOD=`expr $STIME - $OTIME`
    
        echo "INFO: Contraction Over - started at $PTIME ($PERIOD secs since last time) - lasted for $DURATION seconds"
    
        if [ $PERIOD -lt $P_THRESH -a $DURATION -gt $D_THRESH ]
        then
            COUNTER=`expr $COUNTER + 1`
    
            if [ $COUNTER -gt $C_THRESH ]
            then 
                echo "CRIT: Consistent frequency and duration *strongly* suggest hospital visit...."
            else
                echo "WARN: Frequency and duration suggest possible hospital visit...."
            fi
        else
            COUNTER=0
        fi
    done
    

    I will have lost a little bit of faith in humanity and I'll worry for your children if you actually did this.


  • Registered Users Posts: 545 ✭✭✭ravydavygravy


    Sheeps wrote: »
    I will have lost a little bit of faith in humanity and I'll worry for your children if you actually did this.

    I worry for my children too, but hey, what you gonna do.... You can't pick your dad.

    (Baby finally arrived today, after ~28 hours of irregular pre-hospital contractions, so the script worked out being very useful - given that wife was not very diligent at writing times down, but would happily press enter at the start and end of the contractions, until we left for hospital...)


  • Advertisement
  • Registered Users Posts: 10,407 ✭✭✭✭justsomebloke


    Wife about to go into labour? Unsure how to help? What not write a bash script to time her contractions... (seemed like a good idea at the time...)

    I think it's time to remove you as a friend on facebook. oh and congrats:D


  • Registered Users Posts: 545 ✭✭✭ravydavygravy


    To get us back OT - a short and sweet bash webserver....
    while [ true ]; do echo "SERV: The time is `date`" | nc -l 8080; done
    

    Connect to http://127.0.0.1:8080/ to check the output...


  • Moderators, Science, Health & Environment Moderators, Society & Culture Moderators Posts: 3,368 Mod ✭✭✭✭andrew


    Woah, I got linked here from Reddit!


  • Registered Users Posts: 1,038 ✭✭✭rob1891




  • Registered Users Posts: 86 ✭✭RobbieM


    Hi, If this is the wrong forum pls move me!
    Normally i can figure stuff out but with this I'm stuck. Maybe someone here has seen this before:
    set x ="basename path/file.txt .txt" ; echo $x
    and I want the answer to be "file" not "basename path/file.txt .txt"
    I am new to tcsh. Cant find the answer anywhere...


  • Advertisement
  • Registered Users Posts: 1,038 ✭✭✭rob1891


    you need to use backticks and not quotation marks:
    set x =`basename path/file.txt .txt` ; echo $x
    

    Backticks do what you are intending, the line inside the ticks is executed and the output sent to your variable x.

    Rob


  • Registered Users Posts: 86 ✭✭RobbieM


    rob1891 wrote: »
    you need to use backticks and not quotation marks:
    set x =`basename path/file.txt .txt` ; echo $x
    

    Backticks do what you are intending, the line inside the ticks is executed and the output sent to your variable x.

    Rob

    Jeeperss!! Thanks, I love u!! Everybody, give him some thanks!! backticks! brilliant! I knew there must be a way! Brilliant!


  • Registered Users Posts: 590 ✭✭✭bman


    RobbieM wrote: »
    Jeeperss!! Thanks, I love u!! Everybody, give him some thanks!! backticks! brilliant! I knew there must be a way! Brilliant!

    Well you can't say he's not appreciative. Makes up for all the times you supply an answer and receive no thanks :D .


  • Registered Users Posts: 740 ✭✭✭z0oT


    Small snippet I added to root's bashrc to account for Debian not automounting NTFS hard drives properly.
    function ntfsmount {
    
    # Names Given
    name1 = portable
    name2 = 1tb
    
    # UUIDs
    UUID1=DE44D1ED44D1C883
    UUID2=3736C195022556C6
    
    if [ "$1" = "$name1" ]; then
        umount -l /dev/disk/by-uuid/$UUID1
        
            if [ "$2" = "force" ]; then    
            mount -t ntfs-3g -o force,defaults,locale=en_IE.UTF-8 /dev/disk/by-uuid/$UUID1 /media/Portable
            else
            mount -t ntfs-3g -o defaults,locale=en_IE.UTF-8 /dev/disk/by-uuid/$UUID1 /media/Portable    
            fi
        
        elif [ "$1" = "name2" ]; then
        umount -l /dev/disk/by-uuid/$UUID2   
        
            if [ "$2" = "force" ]; then
                    mount -t ntfs-3g -o force,defaults,locale=en_IE.UTF-8 /dev/disk/by-uuid/$UUID2 /media/Ext_HD 
                    else
                    mount -t ntfs-3g -o defaults,locale=en_IE.UTF-8 /dev/disk/by-uuid/$UUID2 /media/Ext_HD   
                    fi
        else
        echo "Hard Drive UUID Not Listed"
    fi
    }
    


  • Registered Users Posts: 740 ✭✭✭z0oT


    A very simple one I put together just solely to download the videos from the speed demos archives easily ( http://speeddemosarchive.com/ ) - 1 command per set of videos per game
    ./<script name> <url of 1st video> <number of videos> <file name prefix>
    #!/bin/bash
    
    length=${#1}
    url=$( echo $1 | cut -c1-$(expr $length - 6))
    extension=$( echo $1 | cut -c$(expr $length - 3)-$length )
    
    for i in $(seq 1 1 9)
    do
    wget -nc -O $3'_'$i$extension $url'0'$i$extension
    done
    
    for i in $(seq 10 1 $2)
    do
    wget -nc -O $3'_'$i$extension $url$i$extension
    done
    


  • Registered Users Posts: 740 ✭✭✭z0oT


    Also here's one to sort out broken downloads from Rapidshare that can happen when using Flashget (under wine). In many cases if a download fails, for instance if I was to run out of trafficshare etc., a ~30K size file is left behind which is no good to anyone. What this does is check for the files of the "broken" size and regenerate the file containing the links to the files that need to be downloaded again.
    Mind you, I could use wget to download using a cookie instead of Flashget in the first place, but it lacks some handy features Flashget has. :pac:
    #!/bin/bash
    
    original_file=links.lst
    broken_file_size=34K
    broken_file_list=BrokenFiles.txt
    new_links_file=NewLinksFile.lst
    
    for f in $(ls *.rar)
    do
    filesize=$(ls -lah | grep $f | awk '{print $5}')
    if [ "$filesize" = "$broken_file_size" ]; then
    echo $f >> $broken_file_list
    fi
    done
    
    while [ 1 ]
    do
    read filename || break
    link=$(grep $filename $original_file)
    echo $link >> $new_links_file
    done < $broken_file_list
    
    unix2dos -u $new_links_file
    


  • Closed Accounts Posts: 1,505 ✭✭✭barura


    Thanks man! That's going to be really handy! :D

    /goes back to lurking


  • Registered Users Posts: 1,889 ✭✭✭evercloserunion


    #!/bin/bash
    
    echo "Hello, world!"
    


  • Closed Accounts Posts: 13,404 ✭✭✭✭sKeith


    Below is a script i use for backing up the OS part of file server linux boxes,
    My main data is stored under /mnt which is excluded this backup
    #!/bin/bash
    
    # Script to backup OS to cd.
    
    # Ensure user is Super User
    
    if [ $(id -u) = 0 ];
    then echo Script to Backup image to cd
    else echo You nee to be superuser to use this script
    exit
    fi
    echo ensuring you have most uptodate tools
    
    # Ive commented out the following line bacause most people have good settings already
    #route add default gw 192.168.1.1 #(your routers ip address)
    
    apt-get update
    apt-get install mkisofs
    apt-get install cdrecord
    clear
    echo Collecting data...
    
    cd /
    tar cpzf /tmp/mybackup.tgz / --exclude=/export --exclude=/proc --exclude=/lost+found --exclude=/mnt --exclude=/sys  --exclude=/tmp --t
    ls /tmp/mybackup.tgz -sh
    eject /dev/cdrom
    read -n 1 -p "Place Blank CD onto CD tray then press any key."
    eject -t /dev/cdrom
    echo .
    echo making cd image
    mkisofs -o /tmp/mybackup.iso /tmp/mybackup.tgz
    echo burning cd image
    cdrecord dev=/dev/cdrom /tmp/mybackup.iso
    eject /dev/cdrom
    echo Finished
    


    here is a dos2unix script
    #!/bin/sh
    
    if [ -z "$2" ];
            then echo "Usage: dos2unix infile outfile"
    else
            awk '{ sub("\r$", ""); print }' $1 > $2
    fi
    
    and the reverse
    #!/bin/sh
    
    if [ -z "$2" ];
            then echo "Usage: unix2dos infile outfile"
    else
            awk 'sub("$", "\r")' $1 > $2
    fi
    


  • Registered Users Posts: 1,183 ✭✭✭dioltas


    Here's a little script I wrote for picking 6 random lottery numbers between 1 and 49.

    #!/bin/bash
        i=0
    	while [ $i -lt 6 ];	do
    			num=$(( ((`od -An -N2 -t u2 /dev/random`)%(49)) +1   ))
             
                instr=`echo $stra | grep -c " $num "`
        
                if [ $instr -eq 0 ]
                    then
                    stra=`echo $stra $num`
                    let i=$i+1
                fi
    
    		done  
    
        echo $stra
    

    Don't think it's a very efficient way of checking for duplicates but it'll do for the purpose!


  • Advertisement
  • Registered Users Posts: 425 ✭✭Mathiasb


    dioltas wrote: »
    Here's a little script I wrote for picking 6 random lottery numbers between 1 and 49.

    #!/bin/bash
        i=0
        while [ $i -lt 6 ];    do
                num=$(( ((`od -An -N2 -t u2 /dev/random`)%(49)) +1   ))
             
                instr=`echo $stra | grep -c " $num "`
        
                if [ $instr -eq 0 ]
                    then
                    stra=`echo $stra $num`
                    let i=$i+1
                fi
    
            done  
    
        echo $stra
    
    Don't think it's a very efficient way of checking for duplicates but it'll do for the purpose!

    Fixed:
    #!/bin/bash
    i=0
    while [ $i -lt 6 ]; do
        num=$(( ((`od -An -N2 -t u2 /dev/random`)%(49)) +1   ))
        instr=`echo $stra | grep -c " $num "`
        if [ $instr -eq 0 ]; then
            stra=`echo $stra $num`
            i=$(($i+1))
        fi
    done  
    echo $stra
    


  • Registered Users Posts: 455 ✭✭zappb




  • Registered Users Posts: 1,889 ✭✭✭evercloserunion


    Here is a simple script I wrote that backs up my home directory to my external hard drive, if it is connected and turned on, and keeps track of when the last backup was performed.
    #!/bin/bash
    
    EXT_HDD_PATH=/media/IOMEGA_HDD # path to your external storage device
    BACKUP_DIR=$EXT_HDD_PATH/home_backup/ # name of directory on storage device that you want to backup to
    TIME_FILE=$HOME/bin/last_backup.txt# name/location of file to keep track of when last backup was performed.
    
    if [[ -e $EXT_HDD_PATH ]]
    then
    
        if [[ ! -e $BACKUP_DIR ]]
        then mkdir $BACKUP_DIR
        fi
    
        rsync -qa $HOME $BACKUP_DIR
        
        date +%s > $TIME_FILE
    
    fi
    

    Then you can put this line in your .conkyrc file:
    ${color grey}Days since backup:$color ${exec echo $((($(date +%s)-$(cat ~/bin/last_backup.txt))/86400))}
    
    Replacing the path with the path to your TIME_FILE (and the color settings with your own, of course), and conky will tell you how many days since you last backed up.

    I wrote it with the intention of crontabing it to run once per day. When I run it from the command line, it appears as though some attributes (like symlinks in certain hidden files) are not properly transferred due to permissions errors. Presumably running the operation as root would take care of that but if you do that remember to change $HOME to the actual path to your home directory, otherwise it will backup /root/. Personally I'm not bothered running it as root in cron because it looks as though what is not properly transferred is insignificant.

    It's a simple script, but if anyone has any comments or suggestions I'd like to hear them as I'm a bit of a noob when it comes to scripting.


  • Registered Users Posts: 85 ✭✭rfrederick


    Out in my neck of the woods (western Kansas) monitoring watches and warnings from the National Weather Service is rather important, especially during the spring, which is the height of tornado season. Thus I have a bit of perl called as a Nagios check that pulls the latest weather alert information from Weather Underground's XML-API for the specified ZIP (postal) code and returns an appropriate alert code for Nagios.
    #!/usr/bin/perl -w
    
    use strict;
    use URI::Escape;
    use XML::Simple;
    
    my $location = $ARGV[0];
    my $alert_output_short;
    my $alert_output_long;
    
    if (not defined $location or $location !~ /^[0-9]{5}$/) {
    	print "Usage: $0 [ZIP Code]\n";
    	exit(3);
    }
    
    $location = uri_escape($location);
    
    my $alert_raw = `wget --quiet -O - http://api.wunderground.com/auto/wui/geo/AlertsXML/index.xml?query=$location`;
    if (not defined $alert_raw) {
    	print "Error grabbing alert information.\n";
    	exit(3);
    }
    
    my $xml = new XML::Simple;
    my $alert_data = $xml->XMLin($alert_raw, forcearray => ['AlertItem']);
    
    if ($alert_data->{alert}->{count} eq 0) {
    	print "No current watches, warnings, or advisories.\n";
    	exit (0);
    }
    
    my $exit_code = 1;
    foreach my $alert (@{$alert_data->{alert}->{AlertItem}}) {
    	if ($alert->{significance} eq "W") {
    		$exit_code = 2;
    	}
    	if (defined $alert_output_short) {
    		$alert_output_short .= "; $alert->{description} In Effect Until $alert->{expires}->{content}";
    	}
    	else {
    		$alert_output_short = "$alert->{description} In Effect Until $alert->{expires}->{content}";
    	}
    	$alert_output_long .= $alert->{message};
    }
    
    print "$alert_output_short$alert_output_long";
    
    exit($exit_code);
    

    Notifications from this script are relayed to me by Nagios via email, IM, and SMS. The script proved itself useful last spring when I received word of a tornado warning around five minutes before the city's sirens were activated for two confirmed tornados approaching the city. :cool:


  • Registered Users Posts: 1,889 ✭✭✭evercloserunion


    Send text messages from the command line. A simple bash script which relies on http://cabbagetexter.com, an excellent service maintained by boardsie Sam Vimes. It's a bit crude, no input validation and lacks polish but it gets the job done. I was going to write it in Python but Python cannot work through the TCD authenticated proxy, while wget can.
    #!/bin/bash
    
    conf_dir="$HOME/.msg"
    if [[ ! -d $conf_dir ]]; then
        mkdir $conf_dir
    fi
    num_file="$conf_dir/numbers"
    login_file="$conf_dir/login"
    login=$(cat $login_file)
    unum=$(echo $login | awk -F ',' '{print $1}')
    pin=$(echo $login | awk -F ',' '{print $2}')
    serv=$(echo $login | awk -F ',' '{print $3}')
    
    function add_number {
        name=$1
        num=$2
        echo "$1,$2" >> $num_file
        echo "Number added."
    }
    
    function send_msg {
        numtest='^[[:digit:]]+$'
        if [[ "$1" =~ $numtest ]]; then
            num=$1
        else
            num=$(cat $num_file | grep "$1" | awk -F ',' '{print $2}')
        fi
        shift
        msg=$(echo "$@" | sed 's/\ /%20/g' | sed "s/'/%27/g")
        url="http://cabbagetexter.com/send.php?u=$unum&p=$pin&s=$serv&d=$num&m=$msg"
        ans=$(wget -qO - $url)
        case $ans in
            -1  )   echo "Invalid login. Message not sent." ;;
            -2  )   echo "Could not log in to network website. Message not sent." ;;
            -5  )   echo "Problem with network website. Message not sent." ;;
            ""  )   echo "No message specified. Message not sent." ;;
            *   )   echo "Message sent. $ans messages left."
        esac
    }
    
    function set_login {
        echo "$1,$2,$3" > $login_file
        echo "Login set."
    }
    
    function empty {
        echo "" > $num_file
        echo "Contact book cleared."
    }
    
    function view_contacts {
        cat $num_file
    }
    
    function gui {
        if [[ $(which zenity 2>/dev/null) ]]; then
            send_msg $(zenity --entry --text='Enter the number or name of the recipient folowed by your message.')
        fi
    }
    
    case "$1" in
        "add"       )   add_number "$2" "$3" ;;
        "login"     )   set_login "$2" "$3" "$4" ;;
        "clear"     )   empty ;;
        "contacts"  )   view_contacts ;;
        ""          )   gui ;;
        *           )   send_msg "$@"
    esac    
    

    Usage is as follows (presuming the script is saved as msg):

    On the first use, set your login details by typing:
    msg login <number> <pin> <m, v or o>
    
    Add a contact (a simple name-number association) with:
    msg add <name> <number>
    
    To send a message, type:
    msg <name or number> <message>
    
    View your saved contacts with:
    msg contacts
    
    Clear contacts with:
    msg clear
    

    Running the script with no arguments, if you have zenity installed, opens a simple GUI prompt. Enter <name or number> <message> to send a message.

    If you see something wrong with it, please let me know. Thanks.


  • Registered Users Posts: 425 ✭✭Mathiasb


    Works wonders :D


  • Closed Accounts Posts: 13,404 ✭✭✭✭sKeith


    OSI wrote: »
    Very simple script that will take an argument and then kill all processes matching the string..
    Is handy for example when you have multiple instances of the one process running, you can kill them all in one go.
    Lookup the command killall. (man killall)
    killall <string>
    nice script all the same. thanks.


  • Registered Users Posts: 220 ✭✭dueyfinster


    Script to output % of a file:
    # !/bin/sh
    # Public Domain, by Neil Grogan 2010
    # Script to output last 30% of file by lines 
    
    OLDFILE="oldlog.txt"
    NEWFILE="newlog.txt"
    PERCENT=0.7
    
    #Use wc to count lines
    LINES=$(wc -l $OLDFILE | awk '{ print $1}')
    
    #Linespercent = 2 decimal places, lines by percent, round to whole
    LINESPERCENT=$(echo "scale=2; $LINES*$PERCENT" | bc | xargs printf "%1.0f" )  
    
    # Use tail to get last  30% and output, can use tail -s with sleep time to have it run on sched.
    tail -n $LINESPERCENT $OLDFILE >> $NEWFILE
    


  • Registered Users Posts: 1,889 ✭✭✭evercloserunion


    Sometimes my internet randomly goes down for five minutes, an hour or a few hours. I just wrote up this simple thing to continuously check for internet connectivity by attempting typing Google, and alert you (and exit) when it manages to connect. It currently waits 10 seconds between ping attempts, just change the 10 to something else to vary sleeping time. Run it, fork it to background and go about your offline work, and don't worry about checking to see if you're back online every 5 minutes.
    #!/bin/sh
    
    on_success() {
            zenity --info --text="Internet is working."
            exit 0 
    }
    
    while true; do ping -c 1 google.com > /dev/null 2>&1 && on_success || sleep 10; done
    


  • Advertisement
  • Registered Users Posts: 3,745 ✭✭✭laugh


    convert gz to bz:

    for i in `ls ../server*/log.*.gz`; do gunzip $i; new=`echo $i | awk 'sub("...$", "")'`; bzip2 $new; done


Advertisement