Created
July 15, 2012 11:56
-
-
Save derhasi/3116420 to your computer and use it in GitHub Desktop.
Rename file and folder to a given filename.txt's content
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Example command