I am trying to execute a find bash command to process hundreds of video files that are all named video-original.mp4
but are in subdirectories of a parent directory.
I believe there might be two issues one being the path ./
— so maybe try using:
find . -name ...
Otherwise the path is translated as .//file
, which doesn't seem correct.
The next issue is that since you are running the find
command from the parent directory anything called with -exec
is going to be output there. Instead we'll want to use -execdir
since that will handle everything within the directory of the file it found. Since you want to create a command out of it we'll make it into a bash function which you can then add you to ~/.bash_profile
or wherever you prefer to setup your environment.
encode () { export target=$2 ; find . -name "*$1*" \
! -name "$target" -execdir bash -c 'ffmpeg -i "$0" -f mp4 -vcodec libx264 \
-preset veryslow -profile:v high -acodec aac -movflags faststart "$target" \
-hide_banner -ss 00:00:10 -vframes 1 thumbnail.jpg' {} \; \
-execdir bash -c 'rm -f "$0"' {} \; ; }
Basically what this does is wrap the entire find
command within a bash function which you can call from the command-line (once added to your profile, etc.):
$ encode mp4 video.mp4
| |
| |___ target file (encode will also skip this file)
|
|___ recursively encode files matching this extension
To summarize, the encode
function wraps the find
command, which in-turn searches recursively for any files matching the extension you select as argument one. The target
(arg two) is the filename or output file to be saved. After the encoding is complete the original file that the target
was encoded from is removed. If a file matches the extension you select and is within the same directory as the target
then the matching file will be encoded to the target
file (overwriting it); regardless of this the target
file is always skipped and never encoded.