Help with detect with regex and move script

Hi all,

I am needing some help with a script that will search for a video file by known extensions and then do a pattern search (I'm guessing via regex) and then based on a match of one type of another move the file to an assigned directory.

I would like to do this with either a shell script such as bash or python however, I want to keep it as simple and compact as possible.

Examples

I have a folder that I have downloaded video files to, they are generally a mix of mp4, mkv, avi etc. and some will be movie files of various description and other will be tv episode that will either be named like mytvshow sxxexx (as in the sxx would be season number like s01 and the exx would be episode number like e02 for example) with a video file extension.) so the file may look like the following
TV show;
mytvshow s01e02.mp4
My Movie
my movieName.mkv

So the script needs to look at the extension or use another process to determine it is a video file and then based on the naming convension move the respective video file to a defined folder like

mytvfiles moved to /home/tv
mymovefiles moved to /home/movie

Would the scripting gurus out there help me by pointing me in the right direction with some examples of what i may use and suggestions on what may be best to suit this requirement i.e python or bash or something else maybe?

Thank you in advance for any assistance offered.

Cheers,
Darren.

Dear Simplify/Darren,

I have a few to questions pose in response first:-

  • Is this homework/assignment? There are specific forums for these.
  • What have you tried so far?
  • What output/errors do you get?
  • What OS and version are you using?
  • What logical process have you considered? (to help steer us to follow what you are trying to achieve)

Most importantly, What have you tried so far?

There are probably many ways to achieve most tasks, so giving us an idea of your style and thoughts will help us guide you to an answer most suitable to you so you can adjust it to suit your needs in future.

We're all here to learn and getting the relevant information will help us all.

Robin

1 Like

Hi Robin,

Thanks for taking the time to respond.

No this is not home or assignment - just something I would like to do to continue to automate my processes.

I have been reading some forums and tinkering around with some bash scripts using sed and awk.

I haven't been successful in getting the right pattern matching working for the tvshows I have been able to bash script the move of the movies without too much problem, however I was hoping to minimise the use of sed or awk and keep it as simple as possible hence the reason I thought I would post here and seek some input from the pros as I am very novice in the Linux scripting environments.

Lubuntu 16.10

scan the download directory, check for video file as there could be apps or docs in the download directory if a video file is found, then check the naming of the video file and then move based on the match of tvshow or movie.

I have only tried to achieve this using bash, however, part of the process is I am calling a python script from another programmer to run some conversion on the video files as well, so I thought it may be more efficient to use python for this process also.

I am using the manual.py script from GitHub - mdhiggins/sickbeard_mp4_automator: Automatically convert video files to a standardized mp4 format with proper metadata tagging to create a beautiful and uniform media library

Dear Simplify/Darren,

It is my pleasure to try to help. It is far more rewarding than the day job (although unpaid) and helps me to learn from others who may make other suggestions or correct me.

Can you show us your attempts so far? It will help us to steer you so (hopefully) you will understand the evolved solution and be able to support it going forward.

I would probably write this in ksh/bash like shells, using the find command and variable substitution, but it depends what you know as to where we start making suggestions. There are, of course, many ways to do this.

Robin

I have been trying to get this pattern match to work for starters and it is doing my head in....

fileInput=$(printf "$1" | sed -n '/\([sS][0-9][0-9][eE][0-9][0-9]\)/p')
if (( -z $(printf "$1" | sed -n '/\([sS][0-9][0-9][eE][0-9][0-9]\)/p')  )); then
echo "yes" 
else 
echo "no"
fi

So the idea of the above code is to check the input file give to the script as a command line argument and if the pattern matches, we get a yes and if no...

Also i would ideally like to incorporate some cleaning of the file name here too... so for example

if the filename input is mytvshow.s01.e02.blah.blah.HDTV.Dolby.mkv i would like to finish with simply mytvshow.s01.e02.mkv

Does that make sense?

would be nice if i didn't need to use sed. :slight_smile:

You could try using bash extended globbing to match for example

for filename in \
    show.01x03.mkv \
    S01E2.show.avi \
    S01E2.show.nfo \
    show.S01.E02-03.mp4 \
    movie.720p.DTS.mkv
do
    ((video=tv=0))
    [[ "$filename" = *@(.mkv|.avi|.mp4) ]] && video=1
    [[ "$filename" = *[Ss]+([0-9])?(.)[Ee]+([0-9])* ]] && tv=1
    [[ "$filename" = *+([0-9])[xX]+([0-9])* ]] && tv=1

    printf "%s VIDEO=%d TV=%d\n" "$filename" $video $tv
done

output:

show.01x03.mkv VIDEO=1 TV=1
S01E2.show.avi VIDEO=1 TV=1
S01E2.show.nfo VIDEO=0 TV=1
show.S01.E02-03.mp4 VIDEO=1 TV=1
movie.720p.DTS.mkv VIDEO=1 TV=0

Extended globbing as described by the bash man page:

  ?(pattern-list)   Matches zero or one occurrence of the given patterns
  *(pattern-list)   Matches zero or more occurrences of the given patterns
  +(pattern-list)   Matches one or more occurrences of the given patterns
  @(pattern-list)   Matches one of the given patterns
  !(pattern-list)   Matches anything except one of the given patterns

Here a pattern-list is a list of items separated by a vertical bar "|" (aka the pipe symbol).

1 Like

Fantastic @Chubler_XL - thank you!

This is very much in line with my thinking/wanted :smiley:

One question how do I change the script to handle if the file names have spaces in the name/string?

for example, show.01x03 episode name.mkv

I have another question that i hope we can make simple with a gob

can we check if both $tv & $video equal 0 then the file is considered a TVShow and if not a Movie?
something like if ["${tv}" -ne 0 -a "${video}" -ne 0]; then echo "is tv show"; else echo "is movie"; fi so they both have to equal 0 for statement to be true else is false.

I am working with the following at present.

for filename in $@; do ((video=tv=0))
    [[ "$filename" = *@(.mkv|.mp4|.m4v|.avi) ]] && video=1
    [[ "$filename" = *[Ss]+([0-9])?(.)[Ee]+([0-9])* ]] && tv=1
    [[ "$filename" = *+([0-9])[xX]+([0-9])* ]] && tv=1
    #printf "%s VIDEO=%d TV=%d\n\n" "$filename" $video $tv
done        

if [ "${video}" -ne 0 ] && [ "${tv}" -ne 0 ]; then 
        printf "TV Show\n"; 
    elif [ "${video}" -ne 0 ] && [ "${tv}" -eq 0 ]; then
        printf "Movie\n"; 
    elif [ "${video}" -eq 0 ]; then
        printf "not video file\n";
    else
    end
fi

printf "Filename = \"${filename}\"\n\n"