Existem algumas propriedades que o seu futuro script deve ter, vamos percorrê-las uma a uma:
Encontre recursivamente todos os arquivos MP4 com um padrão no nome do arquivo e processe-os
Aqui seu amigo é find
- você não precisa da maioria das opções, então algo como find "$STARTFOLDER" -type f -name '*$PATTERN*.mp4'
é um bom começo. Você pode iterar sobre isso com um for
construct
O que você não mencionou: criar automaticamente um novo nome de arquivo
Você pode querer usar basename
para isso, algo nos moldes de BN=$(basename "$FILEPATH" '.mp4'); BP=$(dirname "$FILEPATH"); NEWFILENAME="$BP/$BN-converted.mp4"
parece ser bom.
Juntando tudo
Agora que temos todos os blocos de construção, só precisamos conectar as coisas:
#!/bin/bash
STARTFOLDER="/media/myShare"
PATTERN="xyz"
MARKER="converted"
echo -n "Finding candidate files .."
FILELIST=$(find "$STARTFOLDER" -type f -name '*$PATTERN*.mp4')
echo ".. "$(echo -e "$FILELIST" | wc -l)" found"
while read FILEPATH; do
# A bit of healthy paranoia
test -z "$FILEPATH" && continue
test -f "$FILEPATH" || continue
echo -n "Working on $FILEPATH .."
# New file name
BN=$(basename "$FILEPATH" '.mp4')
BP=$(dirname "$FILEPATH")
NEWFILEPATH="$BP/$BN-$MARKER.mp4"
# Skip result files
ISRESULT=$(echo "$BN" | grep -e "$MARKER\.mp4\$")
if test -n "$ISRESULT"; then
echo ".. skipping (is a result file)"
continue
fi
# Skip processed files
if test -f "$NEWFILEPATH"; then
echo ".. skipping (result file exists)"
continue
fi
# Process
echo -n ".. running ffmpeg .."
RES=$(ffmpeg -i "$FILEPATH" -vf scale=w=320:h=-1 -y -vcodec libx264 -preset ultrafast -r 20 "$NEWFILEPATH" </dev/null 2>&1)
echo ".. done (exit code $?)"
done < <(echo -e "$FILELIST")
Ressalva: Isso não foi testado, é provável que os erros de digitação