Last active
April 9, 2024 20:01
-
-
Save lobianco/8599868 to your computer and use it in GitHub Desktop.
a simple bash script to batch rename television files
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/bash | |
# | |
# Written by Anthony Lobianco, 01/23/2014 | |
# | |
# A simple script to batch rename television files | |
# | |
# USAGE | |
# ----- | |
# chmod a+x tv_rename.sh | |
# ./tv_rename.sh -d /path/to/show/S01 | |
# | |
# CHANGELOG | |
# --------- | |
# | |
# 1.0.0 | |
# ----- | |
# initial commit | |
# | |
# 1.0.1 | |
# ----- | |
# check to make sure input directory exists | |
# | |
# 1.0.2 | |
# ----- | |
# handle file types other than .mkv | |
# make sure new format has same extension as old file | |
# make sure new format includes the SXXEYY placeholder | |
# | |
# 1.0.3 | |
# ----- | |
# if SXXEYY pattern is not present, automatically determine it from filename | |
# | |
VRS=1.0.3 | |
bold=`tput bold` # bold characters in echo | |
normal=`tput sgr0` # normal characters in echo | |
echo " " | |
echo "BATCH RENAME SCRIPT v$VRS" | |
echo -n "server: " | |
echo $SSH_CONNECTION | awk '{print $3}' | |
echo " " | |
DIR="" | |
while getopts ":d:" OPTION | |
do | |
case $OPTION in | |
d) | |
if [ "$OPTARG" = "." ]; then | |
DIR=`pwd` | |
else | |
DIR="$OPTARG" | |
fi | |
;; | |
esac | |
done | |
if [ "$DIR" = "" ]; then | |
echo "no directory specified (use -d /path/to/directory/)" | |
echo "EXIT" | |
exit 1 | |
elif [ ! -d "$DIR" ]; then | |
echo "$DIR does not exist" | |
echo "EXIT" | |
exit 1 | |
fi | |
echo -e "renaming files in:\t ${bold}${DIR}${normal}" | |
LAST_FILE=`ls -l "$DIR" | tail -1 | awk '{print $NF}'` | |
FILE_TYPE=`basename $LAST_FILE | awk -F . '{print $NF}'` | |
echo -e "last file looks like:\t ${bold}${LAST_FILE}${normal}\n" | |
rename_files() { | |
local format=$1 | |
local dry_run=$2 | |
# find SXXEYY pattern | |
REGEX="([sS]([0-9]{2,}|[X]{2,})[eE]([0-9]{2,}|[Y]{2,}))" | |
if [[ ! $format =~ $REGEX ]]; then | |
echo "could not find SXXEYY pattern in new format" | |
echo " " | |
continue | |
else | |
MATCH="${BASH_REMATCH[1]}" | |
fi | |
# needed if directory name has whitespace (e.g. /media/Family Guy/) | |
SAVEIFS=$IFS | |
IFS=$(echo -en "\n\b") | |
SEASON=`basename "$DIR"` | |
EPISODE=1 | |
for ITEM in $(find "$DIR" -type f -name "*.${FILE_TYPE}" | sort); do | |
if (( $EPISODE < 10 )); then | |
SE="${SEASON}E0${EPISODE}" | |
else | |
SE="${SEASON}E${EPISODE}" | |
fi | |
if [[ $MATCH != $SE ]]; then | |
FILE="${format/$MATCH/$SE}" | |
else | |
FILE=$format | |
fi | |
# list the files during dry run, rename them otherwise | |
if $dry_run; then | |
echo -e " mv `basename $ITEM` \n -> $FILE" | |
else | |
if [[ `basename $ITEM` == $FILE ]]; then | |
echo "rename not needed for `basename $ITEM`" | |
else | |
echo -e "renaming $ITEM \n to -> \t $DIR/$FILE" | |
mv $ITEM "$DIR/$FILE" | |
fi | |
fi | |
echo " " | |
EPISODE=$((EPISODE + 1)) | |
done | |
IFS=$SAVEIFS | |
} | |
echo "what format do you want to use to rename files?" | |
echo -e "(ex: Breaking.Bad.SXXEYY.1080p.BluRay.DTS.x264-rovers.mkv)\n" | |
while read -ep "[format]: " FORMAT | |
do | |
echo " " | |
# do some error checks | |
if [[ $FORMAT != *.${FILE_TYPE} ]]; then | |
echo "make sure new format has same file type extension (.${FILE_TYPE})" | |
echo " " | |
continue | |
fi | |
rename_files $FORMAT true | |
echo " " | |
while read -ep "[continue? y/n]: " CONTINUE | |
do | |
if [[ $CONTINUE = y ]]; then | |
break | |
else | |
continue 2 | |
fi | |
done | |
echo " " | |
rename_files $FORMAT false | |
break | |
done | |
echo " " | |
echo "DONE" | |
exit 0 |
@lobianco Hey, I jus found this script. This is so awesome, thank you for this.
But Is it possible to rename with spaces?
Like from Breaking.Bad.s01e01.mkv
to Breaking Bad S01E01 Bluray x264 ROVERS.mkv
simple but useful, thank you!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Loops through all files in a directory and renames them according to the new format you specify. For instance, change:
to:
using format:
Breaking.Bad.SXXEYY.1080p.BluRay.x264.mkv
The directory passed to the script should be a season directory similar to
SXX
(e.g./files/tv/Breaking_Bad/S01
)