Le script de traitement par lots bash HandbrakeCLI ne fonctionne pas.

2

J'essaie d'encoder par lots un tas de fichiers. En regardant sur Internet, je n'ai trouvé que quelques scripts et aucun d'entre eux ne fonctionnait pour moi. J'ai commencé à reconstituer quelque chose et il est proche de travailler moins un problème

La variable PRESET ne fonctionne pas. J'ai même essayé de supprimer la variable et de mettre le code et je ne fonctionnais toujours pas. Je ne suis pas sûr de pouvoir utiliser ce type de commande dans find. Je suis sûr qu’il existe un moyen plus simple et plus élégant de procéder.

#!/bin/bash

SRC="/home/usr/temp/encode"
PRESET="-e x264 -q 20.0 -E faac -B 128 -6 dpl2 -w 1280 --loose-crop --loose-anamorphic --x264-preset veryfast --h264-profile high --h264-level 4.1"    

find $SRC -type f -name '*.mp4' -exec bash -c 'name="{}"; HandBrakeCLI -i "$name" -o "${name}.tmp" $PRESET && rm "$name" && mv "${name}.tmp" "$name"' \;

find $SRC -type f -name '*.wmv' -exec bash -c 'name="{}"; HandBrakeCLI -i "$name" -o "${name%.wmv}.mp4" $PRESET && rm "$name"' \;

find $SRC -type f -name '*.mov' -exec bash -c 'name="{}"; HandBrakeCLI -i "$name" -o "${name%.mov}.mp4" $PRESET && rm "$name"' \;

exit

Si je devais faire ce fichier par fichier à partir de la ligne de commande, il ressemblerait à ceci

HandBrakeCLI -i "filename.mov" -o "filename.mp4" -e x264 -q 20.0 -E faac -B 128 -6 dpl2 -w 1280 --loose-crop --loose-anamorphic --x264-preset veryfast --h264-profile high --h264-level 4.1

Si je devais redimensionner un fichier mp4, je le ferais pour ne pas écraser le fichier car il est encodé. C'est pourquoi j'ai les trucs supplémentaires à la première découverte.

HandBrakeCLI -i "filename.mp4" -o "filename.NEW.mp4" -e x264 -q 20.0 -E faac -B 128 -6 dpl2 -w 1280 --loose-crop --loose-anamorphic --x264-preset veryfast --h264-profile high --h264-level 4.1
J4204144
la source
Un problème: PRESETapparaît entre guillemets. Cela signifie qu'il ne sera pas évalué avant que la bash -ccommande soit exécutée. Vous devez vous rendre PRESETdans ce sous-shell. Par conséquent: PRESET=...==>export PRESET=...
John1024
@ John1024 Cela dépasse ma portée. Je suis très nouveau dans les scripts bash.
J4204144

Réponses:

1

La substitution de variable ne fonctionne pas entre guillemets simples. Utilisez les guillemets doubles et le caractère d'échappement pour insérer des guillemets entre guillemets.

find $SRC -type f -name '*.mp4' -exec bash -c "name=\"{}\"; HandBrakeCLI -i \"$name\" -o \"${name}.tmp\" $PRESET && rm \"$name\" && mv \"${name}.tmp\" \"$name\"" \;

Ceci s’applique également aux autres lignes.

Mis à jour: Ah désolé. J'ai mal interprété votre question.

Voici le script révisé. Au lieu d'utiliser exec, j'utilise while-do to looping

#!/bin/bash

SRC="/home/usr/temp/encode"
PRESET="-e x264 -q 20.0 -E faac -B 128 -6 dpl2 -w 1280 --loose-crop --loose-anamorphic --x264-preset veryfast --h264-profile high --h264-level 4.1"    

find $SRC -type f -name '*.mp4' | while read name; do HandBrakeCLI -i "${name}" -o "${name}.tmp" ${PRESET} && rm "${name}" && mv "${name}.tmp" "${name}"; done

find $SRC -type f -name '*.wmv' | while read name; do HandBrakeCLI -i "${name}" -o "${name%.wmv}.mp4" ${PRESET} && rm "${name}"; done

find $SRC -type f -name '*.mov' | while read name; do HandBrakeCLI -i "${name}" -o "${name%.mov}.mp4" ${PRESET} && rm "${name}"; done

exit
Masegaloeh
la source
Je reçoisMissing input device. Run HandBrakeCLI --help for syntax.
J4204144
Ah, j'ai mal interprété votre question. S'il vous plaît regardez ma réponse mise à jour.
masegaloeh
Cela a fonctionné parfaitement. Un énorme merci de m'aider.
J4204144