#!/bin/bash # Deleting all locale files on system # *not* listed in /etc/locale.nopurge set -e LOCALEDIRS="/usr/share/locale /usr/local/share/locale /usr/kde/?.?/share/locale /opt/sun-jdk-*/jre/lib/locale /opt/sun-jre-bin-*/lib/locale /usr/lib/locale /usr/share/binutils-data/*/*/locale /usr/share/gcc-data/*/*/locale" MANPAGEDIRS="/usr/share/man /usr/man /usr/local/share/man /usr/kde/?.?/share/man /usr/kde/?.?/man /opt/sun-jdk-*/man /opt/sun-jre-bin-*/man" LOCALELIST="/var/cache/localepurge/localelist" CONFIGFILE="/etc/locale.nopurge" VERSION="0.5.4" LOCALETOTAL=0 MANTOTAL=0 SPACETMP=0 GOOD=$'\e[32;01m' WARN=$'\e[33;01m' BAD=$'\e[31;01m' NORMAL=$'\e[0m' HILITE=$'\e[36;01m' BRACKET=$'\e[34;01m' BOLD=$'\e[1m' ACTION="/bin/rm -f" eerror () { echo -e " ${BAD}*${NORMAL} $*" 2> /dev/stderr } ewarn () { echo -e " ${WARN}*${NORMAL} $*" } einfo () { echo -e " ${GOOD}*${NORMAL} $*" } etab () { echo -e " ${GOOD}*${NORMAL} $*" } print() { for x in $@; do if [ "${x}" = "" ]; then return 0 else /bin/echo $x fi done } ayuda () { echo "${HILITE}localepurge${NORMAL} for ${BOLD}Gentoo Linux${NORMAL} ${BRACKET}[${NORMAL} ${GOOD}${VERSION}${NORMAL} ${BRACKET}]${NORMAL}" echo -e " " "by bass@gentoo.org" echo einfo "Remember that you must edit ${CONFIGFILE}" echo einfo "Usage: `basename $0` [options]" echo etab "${BOLD}-debug (-d) ${NORMAL} : debug mode." etab "${BOLD}-help (-h) ${NORMAL} : show this help." etab "${BOLD}-list (-l) ${NORMAL} : list directories to be cleared" etab "${BOLD}-nocolor (-nc) ${NORMAL} : no color mode." etab "${BOLD}-pretend (-p) ${NORMAL} : pretend mode." etab "${BOLD}-verbose (-v) ${NORMAL} : verbose mode." etab "${BOLD}-version ${NORMAL} : show version." echo } version () { einfo "${BRACKET}[${NORMAL} ${GOOD}${VERSION}${NORMAL} ${BRACKET}]${NORMAL}" } # Check options in CONFIGFILE grep -xq SHOWFREEDSPACE ${CONFIGFILE} && SHOWFREEDSPACE=enabled grep -xq VERBOSE ${CONFIGFILE} && VERBOSE=enabled grep -xq NOCOLOR ${CONFIGFILE} && unset GOOD WARN BAD NORMAL HILITE BRACKET BOLD # We need to loop through for no color first, otherwise options that exit # will make us ignore nocolor, so we might as well loop for debug first as well for x in $@ do if [ "$x" = "-debug" ] || [ "$x" = "-d" ]; then set -x fi if [ "$x" = "-nocolor" ] || [ "$x" = "-nc" ]; then unset GOOD WARN BAD NORMAL HILITE BRACKET BOLD fi done # Loop through the rest of the options for x in $@; do if [ "$x" = "-help" ] || [ "$x" = "-h" ]; then ayuda exit 0 elif [ "$x" = "-list" ] || [ "$x" = "-l" ]; then LIST=enabled elif [ "$x" = "-pretend" ] || [ "$x" = "-p" ]; then PRETEND=enabled ACTION=print SHOWFREEDSPACE=disabled elif [ "$x" = "-verbose" ] || [ "$x" = "-v" ]; then VERBOSE=enabled ACTION="/bin/rm -vf" elif [ "$x" = "-version" ] ; then version exit 0 else eerror "Unrecognised option: ${x}" eerror "Please see `basename $0` -help" exit 1 fi if [ "${LIST}" = "enabled" ] && [ "${PRETEND}" = "enabled" ]; then eerror "Cannot have list and pretend mode enabled at the same time" eerror "Please enable one at a time" echo >> /dev/stderr eerror "For more information, see `basename $0` -help" fi done # Do nothing and report why if no valid configuration file exists: if [ ! -f ${CONFIGFILE} ]; then eerror " No ${CONFIGFILE} file present, exiting ..." exit 0 else if [ "`grep -x ^NEEDSCONFIGFIRST ${CONFIGFILE}`" ]; then echo "" einfo " You have to configure \"${CONFIGFILE}\" " echo "" einfo " to make $0 actually start to function." echo "" einfo " Nothing to be done, exiting ..." echo "" exit 0 fi fi # Prune the locale list using CONFIGFILE as a list of regex patterns: PURGELIST=`grep -xvf ${CONFIGFILE} "${LOCALELIST}"` # Deleting a filepath and optionally counting freed space remove() { local REMOVEPATH="$1" if [ "$SHOWFREEDSPACE" = "enabled" ]; then SPACEBEFORE=$(df -P ${REMOVEPATH}| awk '{if ( NR==2 ) { print $3 }}') fi ${ACTION} `find ${REMOVEPATH} -type f -o -type l` if [ "$SHOWFREEDSPACE" = "enabled" ]; then # if symlink, REMOVEPATH could be removed # check from parentdir then if [ -d ${REMOVEPATH} ]; then SPACEAFTER=$(df -P ${REMOVEPATH} | awk '{if ( NR==2 ) { print $3 }}') else SPACEAFTER=$(df -P ${REMOVEPATH%/*} | awk '{if ( NR==2 ) { print $3 }}') fi SPACESUM=$(($SPACEBEFORE - $SPACEAFTER)) if test $SPACESUM -gt 0 ; then SPACETMP=$(($SPACETMP + $SPACESUM)) fi fi } # Getting rid of superfluous locale files in $LOCALEDIR: purgelocale () { local LOCALEDIR="$1" if [ -d $LOCALEDIR ]; then if [ "$VERBOSE" = "enabled" ]; then einfo "localepurge: processing locale files in ${LOCALEDIR} ..." fi for LOCALE in `/bin/ls ${LOCALEDIR}`; do if echo "${PURGELIST}" | grep -xq ${LOCALE}; then if [ -d ${LOCALEDIR}/${LOCALE}/LC_MESSAGES ]; then if [ "${LIST}" = "enabled" ]; then echo "${LOCALEDIR}/${LOCALE}" else remove "${LOCALEDIR}/${LOCALE}" fi fi fi done if [ "$SHOWFREEDSPACE" = "enabled" ]; then if test $SPACETMP -gt 0 ; then LOCALETOTAL=$(($LOCALETOTAL + $SPACETMP)) einfo "localepurge: Disk space freed in $LOCALEDIR: ${BOLD}"$SPACETMP"K${NORMAL}" fi SPACETMP=0 fi fi } # Getting rid of localized man pages in $MANPAGEDIR purgeman () { local MANPAGEDIR="$1" if [ -d $MANPAGEDIR ] && [ "`grep -x ^MANDELETE ${CONFIGFILE}`" ]; then if [ "$VERBOSE" = "enabled" ]; then einfo "localepurge: processing man pages in ${MANPAGEDIR} ..." fi for LOCALE in `/bin/ls ${MANPAGEDIR} | grep -v ^man[1-9]`; do if echo "${PURGELIST}" | grep -xq ${LOCALE}; then if [ -d ${MANPAGEDIR}/${LOCALE} ]; then if [ "${LIST}" = "enabled" ]; then echo "${MANPAGEDIR}/${LOCALE}" else remove "${MANPAGEDIR}/${LOCALE}" fi fi fi done if [ "$SHOWFREEDSPACE" = "enabled" ]; then if test $SPACETMP -gt 0 ; then MANTOTAL=$(($MANTOTAL + $SPACETMP)) einfo "localepurge: Disk space freed in $MANPAGEDIR: ${BOLD}"$SPACETMP"K${NORMAL}" fi SPACETMP=0 fi fi } [ "${LIST}" = "enabled" ] && [ "${VERBOSE}" = "enabled" ] && ewarn "If not in list mode, localepurge would clear the following directories:\n" [ "${PRETEND}" = "enabled" ] && [ "${VERBOSE}" = "enabled" ] && ewarn "If not pretending, localepurge would delete the following files:\n" for folder in ${LOCALEDIRS}; do purgelocale "$folder" done for folder in ${MANPAGEDIRS}; do purgeman "$folder" done # Calculating and reporting total disk space freed: if [ "$SHOWFREEDSPACE" = "enabled" ]; then let TOTAL=$LOCALETOTAL+$MANTOTAL if test $TOTAL -lt 0; then TOTAL=0 fi echo "" einfo "Total disk space freed by localepurge: ${BOLD}"$TOTAL"K${NORMAL}" echo "" fi