Skip to content

Instantly share code, notes, and snippets.

@Rotron
Forked from allanscullion/cleanup_ftp.sh
Created March 4, 2020 10:07
Show Gist options
  • Save Rotron/8b85b64096af4a3f7cea6b85e3af7f74 to your computer and use it in GitHub Desktop.
Save Rotron/8b85b64096af4a3f7cea6b85e3af7f74 to your computer and use it in GitHub Desktop.

Revisions

  1. @allanscullion allanscullion created this gist Oct 27, 2014.
    136 changes: 136 additions & 0 deletions cleanup_ftp.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,136 @@
    #!/bin/bash

    PROGNAME=$(basename $0)

    OUTFILE="/tmp/ftplist.$RANDOM.txt"
    CMDFILE="/tmp/ftpcmd.$RANDOM.txt"
    ndays=14

    print_usage() {
    echo ""
    echo "$PROGNAME - Delete files older than N days from an FTP server"
    echo ""
    echo "Usage: $PROGNAME -s -u -p -f (-d)"
    echo ""
    echo " -s FTP Server name"
    echo " -u User Name"
    echo " -p Password"
    echo " -f Folder"
    echo " -d Number of Days (Default: $ndays)"
    echo " -h Show this page"
    echo ""
    echo "Usage: $PROGNAME -h"
    echo ""
    exit
    }

    # Parse parameters
    options=':hs:u:p:f:d:'
    while getopts $options flag
    do
    case $flag in
    s)
    FTPSITE=$OPTARG
    ;;
    u)
    FTPUSER=$OPTARG
    ;;
    p)
    FTPPASS=$OPTARG
    ;;
    f)
    FTPDIR=$OPTARG
    ;;
    d)
    ndays=$OPTARG
    ;;
    h)
    print_usage
    ;;
    \?)
    echo "Invalid option: -$OPTARG" >&2
    exit 1
    ;;
    :)
    echo "Option -$OPTARG requires an argument." >&2
    exit 1
    ;;
    esac
    done

    shift $(($OPTIND - 1))

    if [[ -z "$FTPSITE" || -z "$FTPUSER" || -z "$FTPPASS" || -z "$FTPDIR" ]];
    then
    echo "ERROR: Missing parameters"
    print_usage
    fi


    # work out our cutoff date
    TDATE=`date --date="$ndays days ago" +%Y%m%d`

    echo FTP Site: $FTPSITE
    echo FTP User: $FTPUSER
    echo FTP Password: $FTPPASS
    echo FTP Folder: $FTPDIR
    echo Removing files older than $TDATE

    # get directory listing from remote source
    ftp -i -n $FTPSITE <<EOMYF > /dev/null
    user $FTPUSER $FTPPASS
    binary
    cd $FTPDIR
    ls -l $OUTFILE
    quit
    EOMYF

    if [ -f "$OUTFILE" ]
    then

    # Load the listing file into an array
    lista=($(<$OUTFILE))

    # Create the FTP command file to delete the files
    echo "user $FTPUSER $FTPPASS" > $CMDFILE
    echo "binary" >> $CMDFILE
    echo "cd $FTPDIR" >> $CMDFILE

    COUNT=0

    # loop over our files
    for ((FNO=0; FNO<${#lista[@]}; FNO+=9));do
    # month (element 5), day (element 6) and filename (element 8)
    FMM=${lista[`expr $FNO+5`]}
    FDD=${lista[`expr $FNO+6`]}
    FYY=${lista[`expr $FNO+7`]}

    if [[ $FYY == *\:* ]]
    then
    FDATE=`date -d "$FMM $FDD" +'%Y%m%d'`
    else
    FDATE=`date -d "$FMM $FDD $FYY" +'%Y%m%d'`
    fi

    # echo $FDATE
    # check the date stamp
    if [[ $FDATE -lt $TDATE ]];
    then
    echo "Deleting ${lista[`expr $FNO+8`]}"
    echo "delete ${lista[`expr $FNO+8`]}" >> $CMDFILE
    COUNT=$[$COUNT + 1]
    fi
    done
    echo "quit" >> $CMDFILE


    if [[ $COUNT -gt 0 ]];
    then
    cat $CMDFILE | tr -d "\r" > $CMDFILE
    ftp -i -n $FTPSITE < $CMDFILE > /dev/null
    else
    echo "Nothing to delete"
    fi

    rm -f $OUTFILE $CMDFILE
    fi