Skip to content

Instantly share code, notes, and snippets.

@derhasi
Created July 15, 2012 11:56
Show Gist options
  • Save derhasi/3116420 to your computer and use it in GitHub Desktop.
Save derhasi/3116420 to your computer and use it in GitHub Desktop.
Rename file and folder to a given filename.txt's content
#!/bin/sh
# Verbose helper method.
# @1 bool verbose switch
# @2 string text
# @3 string log file
myverboseoutput() {
if [ $1 = TRUE ]
then echo $2;
fi
# Trim logfile filename.
LOGF=${3## }
LOGF=${LOGF%% }
if [ ! $LOGF = "" ]
then echo $(date)"\t$2" >> $LOGF
fi
}
## parameters
# $1 - path
# $2 - file map (like *.avi)
# $3 - filename file
# options
# -r : recursive
# -v : verbose
# -s : simulate
# -l : logfile
# -f : rename folder too
# -d : delete filename file
# Parse Options
RECURSIVE=FALSE
VERBOSE=FALSE
SIMULATE=FALSE
LOGFILE=""
RENAME_FOLDER=FALSE
DELETE_FILENAME_FILE=FALSE
while getopts "rvsfdl:" OPTION
do
case $OPTION in
r) RECURSIVE=TRUE;;
v) VERBOSE=TRUE;;
s) SIMULATE=TRUE;;
l) LOGFILE=$OPTARG;;
f) RENAME_FOLDER=TRUE;;
d) DELETE_FILENAME_FILE=TRUE;;
esac
done
# Shift params as long as they are options.
shift $((OPTIND-1))
# Check parameters and set defaults
ROOT_PATH=${1:-"."}
FILE_EXT=${2:-"avi"}
FILENAME_FILE=${3:-"filename.txt"}
# Quit if root folder does not exist.
if [ ! -d $ROOT_PATH ]
then echo "Folder $ROOT_PATH does not exist."; exit
fi
# Find all folders to run through
declare -a FOLDERS
if [ $RECURSIVE = TRUE ]
then
FOLDERS=$(find $ROOT_PATH -type d)
else
FOLDERS=($ROOT_PATH)
fi
# Declare for separators to not use spaces.
SAVEIFS=$IFS
IFS=$(echo "\n\b")
for FOLDER in $FOLDERS
do
myverboseoutput $VERBOSE "Scanning $FOLDER" $LOGFILE
# Check if there is a FILENAME_file
FILENAME=""
if [ -f "$FOLDER/$FILENAME_FILE" ]
then
FILENAME=$(cat "$FOLDER/$FILENAME_FILE");
# If we got a valid filename
if [ $((${#FILENAME}>0)) ]
then
myverboseoutput $VERBOSE "\tFilename: $FILENAME" $LOGFILE
# count files to be renamed.
FCOUNT=0
# 2> /dev/null is for hiding errors (e.g. if no file with the map exists)
for FOUND_FILE in $(find $FOLDER/*.$FILE_EXT -type f -prune 2> /dev/null)
do
myverboseoutput $VERBOSE "\t\tFile: $FOUND_FILE" $LOGFILE
FBASE=$(basename "$FOUND_FILE" ".$FILE_EXT")
myverboseoutput $VERBOSE "\t\t\tBase: $FBASE" $LOGFILE
if [ $FCOUNT = 0 ]
then
myverboseoutput $VERBOSE "\t\t\t$FOUND_FILE ==> $FOLDER/$FILENAME.$FILE_EXT" $LOGFILE
if [ ! $SIMULATE = TRUE ]
then
mv $FOUND_FILE "$FOLDER/$FILENAME.$FILE_EXT"
fi
else
myverboseoutput $VERBOSE "\t\t\t$FOUND_FILE ==> $FOLDER/$FILENAME $FCOUNT.$FILE_EXT" $LOGFILE
if [ ! $SIMULATE = TRUE ]
then
mv $FOUND_FILE "$FOLDER/$FILENAME $FCOUNT.$FILE_EXT"
fi
fi
FCOUNT=$(($FCOUNT+1))
done
# Delete filename file
if [ $DELETE_FILENAME_FILE = TRUE ]
then
myverboseoutput $VERBOSE "\t\tRemoved: $FOLDER/$FILENAME_FILE" $LOGFILE
if [ ! $SIMULATE = TRUE ]
then rm "$FOLDER/$FILENAME_FILE"
fi
fi
# Rename folder
if [ $RENAME_FOLDER = TRUE ]
then
if [ ! $FOLDER = $(dirname "$FOLDER") ]
then
NEWFILE=$(dirname "$FOLDER")"/$FILENAME"
myverboseoutput $VERBOSE "\t\tFolder: $FOLDER ==> $NEWFILE" $LOGFILE
if [ ! $SIMULATE = TRUE ]
then mv $FOLDER $NEWFILE
fi
fi
fi
fi
fi
done
# reset for seperator.
IFS=$SAVEIFS
@derhasi
Copy link
Author

derhasi commented Jul 15, 2012

Example command

sh ~/filerenamer.sh -rfv -l rename.log . avi filename.txt

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment