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.
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:
@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).
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.
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
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:
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)
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)
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)
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)
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)
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)
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)
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)
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)