Learning to Script in Linux


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Learning to Script in Linux
# 1  
Old 05-20-2018
Learning to Script in Linux

Hello,

I'm trying to branch out and learn Linux, but my comfort zone is PowerShell. I figure the best way to learn it is to do it so I moved my Plex Media Server to Ubuntu Server.

What I'm trying to do is build a script that searches a directory and all subdirectories for files with the .ts extension, then sends them to handbrakecli to get converted, then deletes the .ts file because its huge. Here's what I've got so far. It's a mix of PowerShell and what I've gleened/stolen from around the internet. I've commented the end of each line that isn't bash, but I'm sure you guys will be able to tell.


Code:
#SRC=./SOURCE_FOLDER/
    #DEST=./DESTINATION_FOLDER/
    DEST_EXT=mp4
    HANDBRAKE_CLI=/Applications/HandBrakeCLI
    PRESET="Roku 720p30 Surround"

$NeedToConvert = Get-ChildItem -Path '/mnt/raid' -Recurse -include "*.ts" #PowerShell
foreach($file in $NeedToConvert){ #PowerShell
    $Location = $file.DirectoryName #PowerShell
    $FileName = $File.name.substring(
    SRC=$Location #mix
    DEST=$file.name.substing(0,(file.name.length)-3) #mix
    DEST=$Location #mix
    $HANDBRAKE_CLI -i $SRC/$FILE -o $DEST.$DEST_EXT --preset="$PRESET"
    if(Test-Path -Path PathToNewFile){ #PowerShell
        $file.delete() #PowerShell
    } #PowerShell
 } #PowerShell

Any help or pointers in the right direction would be awesome!

Last edited by Scrutinizer; 05-27-2018 at 01:04 AM.. Reason: quote tags -> code tags
# 2  
Old 05-20-2018
This should get you started:

Code:
SRC=./SOURCE_FOLDER/
DEST=./DESTINATION_FOLDER/
DEST_EXT=mp4
HANDBRAKE_CLI=/Applications/HandBrakeCLI
PRESET="Roku 720p30 Surround"


find /mnt/raid -iname "*.ts" -print | while read filepath
do
    LOCATION=${filepath%/*}  # Delete everything in $filepath from last slash to end and store in LOCATION
    FILENAME=${filepath##*/} # Delete everything in $filepath from front to last slash and store in FILENAME
    SRC=${LOCATION}
    DEST=${FILENAME%.*}      # Delete everything in $FILENAME from last dot to end and store in DEST   

    $HANDBRAKE_CLI -i "$SRC/$FILENAME" -o "$SRC/${DEST}.${DEST_EXT}" --preset="$PRESET"
    if [ -s "$SRC/${DEST}.${DEST_EXT}" ]    # File exists and has size greater than zero
    then
        rm "$filepath"
    fi
done

These 2 Users Gave Thanks to Chubler_XL For This Post:
# 3  
Old 05-21-2018
@Chubler_XL Thanks! I don't have the time right now to dive all the way in but just playing with the find command and digging through its manual...thanks so much. I'll let you know.

---------- Post updated at 08:57 PM ---------- Previous update was at 05:39 PM ----------

So the find command prints out all of the ts files, and the script works when I run it, but it stops after the first encode. I'm not sure why. Is it something to do with handbrakecli coming back and basically saying "hey i'm done" causing the script to then think that it too is done?
Heres the output for the end:
Code:
Muxing: this may take awhile...[00:44:05] mux: track 0, 133307 frames, 1434924901 bytes, 2520.47 kbps, fifo 2048
 [00:44:05] mux: track 1, 213492 frames, 93191479 bytes, 163.69 kbps, fifo 4096
[00:44:05] mux: track 2, 142325 frames, 218611200 bytes, 383.99 kbps, fifo 2048
[00:44:05] libhb: work result = 0

Encode done!

HandBrake has exited.
 rhys@odin:~$

and here's what I ran. a couple small changes, one to correct a mistake in what I originally posted, and a change to the path to limit the number of tracks it would find.
Code:
#!/bin/bash

SRC=./SOURCE_FOLDER/
DEST=./DESTINATION_FOLDER/
DEST_EXT=mp4
#HANDBRAKE_CLI=/Applications/HandBrakeCLI
PRESET="Roku 720p30 Surround"


find '/mnt/raid/Kids Movies' -iname "*.ts" -print | while read filepath
do
    LOCATION=${filepath%/*}  # Delete everything in $filepath from last slash to end and store in LOCATION
    FILENAME=${filepath##*/} # Delete everything in $filepath from front to last slash and store in FILENAME
    SRC=${LOCATION}
    DEST=${FILENAME%.*}      # Delete everything in $FILENAME from last dot to end and store in DEST

    HandBrakeCLI -i "$SRC/$FILENAME" -o "$SRC/${DEST}.${DEST_EXT}" --preset="$PRESET"
    if [ -s "$SRC/${DEST}.${DEST_EXT}" ]    # File exists and has size greater than zero
    then
        rm "$filepath"
    fi
done

It should have moved on to the second movie in the folder with the matching .ts extension, but it stopped after the first one.


I'm assuming that the done is the closer of the while loop and that it should hit done and move back to the while (so long as there is another input).


Thanks for any help.
# 4  
Old 05-22-2018
Nothing in that loop ought to make it quit, so maybe it only found one movie for some reason. Run that find statement by itself and see how many files it finds.
# 5  
Old 05-26-2018
Got it!

Hello again,


Its been a minute since i've been here, but i finally figured it out. Here is the end result:
Code:
#!/bin/bash

#build an array of the results of find
array=()
while IFS=  read -r -d $'\0'; do
    array+=("$REPLY")
done < <(find '/mnt/raid/media' -iname "*.ts" -print0)

#go through the results
arrayLength=${#array[@]}
for (( i=0; i<$arrayLength; i++ ))
do
        filepath=${array[$i]}
        echo "${filepath}" >> '/home/rhys/converted_files.log'
    LOCATION=${filepath%/*}  # Delete everything in $filepath from last slash to end and store in LOCATION
    FILENAME=${filepath##*/} # Delete everything in $filepath from front to last slash and store in FILENAME
    SRC=${LOCATION}
    DEST=${FILENAME%.*}      # Delete everything in $FILENAME from last dot to end and store in DEST
        #convert movie
        HandBrakeCLI -i "$SRC/$FILENAME" -o "$SRC/${DEST}.mp4" --preset="Roku 720p30 Surround" -s "1,2,3,4,5,6"
        ExitCode=$?
        if [ $ExitCode -ne 0 ]
        then
                echo "failed. removing faulty file" >> 'home/rhys/converted_files.log'
                rm "$filepath" #it didn't work. Delete the faulty file
        fi

        if [ -s "$SRC/${DEST}.${DEST_EXT}" ]    # File exists and has size greater than zero
        then
        rm "$filepath" #it worked and the old ts file can be removed
    fi
    sleep 2 #cuz even CPUs deserve a short break
done

something about the while loop wasn't working. I had it echo the filepath before it began and that showed me that although running the find by itself as suggested showed all the files, the second time through the loop it returned an empty string instead of the next item in the list.
That's when I decided to put it in an array and loop through it. Thanks for the help, especially that first bit with the comments showing what each line did. Helped me crack the code so to speak Smilie


I'm sure you guys will see me around.
# 6  
Old 05-27-2018
The symptom "while read loop stops after one cycle" is typical for a conmand that reads from stdin, sucking from the input that is for the read command.
Maybe HandBrakeCLI is such a command? Then it helps to redirect its input
Code:
</dev/null HandBrakeCLI ...

or
Code:
HandBrakeCLI ... < /dev/null

These 2 Users Gave Thanks to MadeInGermany For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. Programming

Learning python, lost with script

Hi there, im just having a hard time understanding why this code does not print anything that is suppose to print: score = raw_input ('what is your score? \n') try: if 1.0 == float(score) >= 0.9: print "A" elif 0.9 > float(score) >= 0.8: ... (1 Reply)
Discussion started by: la2015
1 Replies

2. UNIX for Dummies Questions & Answers

Setting up a home network for learning Linux

I am working on learning Linux, and somebody suggested setting up Linux on a separate computer, and searching for answers to whatever may be needed, on a different computer plugged in to the Internet. I have a Windows 7 PC, plugged in to a cable modem, and an old notebook, Compaq Presario R3000... (5 Replies)
Discussion started by: AdultFoundry
5 Replies

3. Shell Programming and Scripting

Learning abt Linux OS

hi guys, i got job recently in a company which provide a product for data backup and data recovery... as dis product is wrriten in c++ am workin in c++.. now am under training and i want to learn abt Operating System concepts and OS programming using c and c++. i know basic c and c++ programming... (0 Replies)
Discussion started by: senthil.march
0 Replies

4. Programming

Learning OS design, Linux Vs. Minix???

Hi friends, I hope everybody is fine. I have been studing operating system concepts at college, and I find this subject very interesting. I've decided that I must go into this field no matter what, hopefully someday I would design my own operating system. I have two choices infront of me, studying... (9 Replies)
Discussion started by: gabam
9 Replies

5. Linux

which linux is best for learning unix?

I have just installed Ubuntu because I need a linux system asap and Ubuntu seems to be easiest for that. But I plan on installing some other Linux distro's for a while (maybe on virtualBox too) so i can understand the inner workings of linux and especially more about unix. I know that alot of the... (11 Replies)
Discussion started by: fuzzylogic25
11 Replies

6. UNIX for Dummies Questions & Answers

learning how to script

I have this command line entry that I would like to turn into a script. I want to be able to just run the script with options for the report name and switch. Can anyone help me get started? I am hoping that by creating this script it will help me be able to create more. I have never written one. I... (11 Replies)
Discussion started by: llsmr777
11 Replies

7. UNIX for Dummies Questions & Answers

Learning Unix/Linux from the Start?

I was wondering if someone could tell me where I could learn everything about Unix/Linux and I was also wondering what the differance between Unix and Linux was :confused: Ive never used it, never seen it.. But Im interested in learning :D (3 Replies)
Discussion started by: Vallzi
3 Replies

8. Shell Programming and Scripting

learning how to use shell script

hello everyone, i am still trying to get this script to work, but with no luck. It is a little beyond my knowledge of scripting at the moment. The beginner book i have has an exercise listed that asks me to write a script tha allows for user input. For example " what is your name: " and then you... (3 Replies)
Discussion started by: bebop1111116
3 Replies

9. UNIX for Dummies Questions & Answers

Learning Unix & Linux

I'm new to Unix. I'm just looking for really good unix documents through Internet as pdf format on programming in all shells, and system adminstrator documents, and well as just all around really good documents on unix. Thank you (5 Replies)
Discussion started by: faaarin
5 Replies
Login or Register to Ask a Question