J'ai besoin de convertir des vidéos, mais je ne sais pas où elles se trouvent, j'ai donc besoin d' find
eux. Comment puis-je donner le résultat et un nom de fichier de sortie à FFmpeg avec xargs
?
J'ai déjà découvert que je peux construire les deux paramètres avec cette commande:
find . -iname "*.mov" -printf "%p %f\n"
Je ne trouve rien de connexe dans le xargs
manuel. Je veux quelque chose comme ça:
find . -iname "*.mov" -printf "%p %f\n" | xargs ffmpeg -i {param1} -f flv {param2}
Comment puis-je faire ceci?
command-line
bash
xargs
command-line-arguments
kissgyorgy
la source
la source
xargs
en général pourraient vouloir consulter stackoverflow.com/questions/3770432/… .Réponses:
Quelque chose comme ça fera l'affaire et de préserver le chemin complet, l' espace de poignée, changement de nom
folder/movie.mov
àfolder/movie.flv
, etc.Et si je vous ai mal compris et que vous voulez tous les films .flv dans le répertoire courant, utilisez celui-ci à la place:
la source
La raison pour laquelle les gens utilisent
xargs
en combinaison avec find est que plusieurs noms de fichiers seront transmis au même appel de programme quel que soit lexargs
lancement du programme . Par exemple, sifind
renvoie les fichiers foo , bar et baz , les éléments suivants ne s'exécuterontmv
qu'une seule fois:En effet, il appelle
mv
comme suit:Si vous n'avez pas besoin ou ne voulez pas ce comportement (comme je suppose que c'est le cas ici), vous pouvez simplement utiliser
find
's'-exec
.Dans ce cas, une solution simple serait d'écrire un court script shell, comme suit:
Enregistrez sous
myffmpeg.sh
et exécutezchmod +x myffmpeg.sh
. Ensuite, exécutez ce qui suit:Cela invoquera le script shell une fois pour chaque fichier trouvé. Le script shell extrait à son tour le nom de fichier du chemin complet et appelle
ffmpeg
avec les arguments appropriés.la source
Je n'ai pas obtenu la solution que j'attendais, alors j'ai découvert la mienne. @ La réponse de Daniel est bonne, mais elle nécessite un script shell. Un one liner est plus rapide, et je l'aime mieux :) aussi une solution plus simple que d'écrire un script.
Je pourrais utiliser un argument et le traiter avec
basename
et en utilisantsh -c
Le -i indique à xargs de le remplacer
{}
par l'argument actuel.La sortie de la commande à l'intérieur de `` imprimé sur la sortie standard (fonction bash)
basename {}
sera donc évaluée comme le nom de fichier nu et imprimée.-0 pour gérer correctement les noms de fichiers spéciaux, mais vous devez passer les paramètres avec l'option -print0 avec find
la source
Vous devez le faire comme toutes les réponses là-haut, mais l'utilisation EXACTE de xargs sera quelque chose comme ceci:
Donc dans votre cas ce sera:
PS: Cela répond à la question sur les xargs pour ceux qui recherchent une réponse exacte pour plusieurs
xargs
paramètres dans une seulexargs
commande.la source
Pourquoi ne pas simplement déplacer les options de ffmpeg pour qu'elles correspondent au format des résultats de la commande find ?
Notez l'ajout de l' option -r à xargs pour l'empêcher d'exécuter ffmpeg si aucun fichier .mov n'est trouvé.
J'ai ajouté l' option -n2 à xargs pour limiter le nombre d'éléments traités par xargs à deux à la fois. Dans ce cas, les éléments sont le chemin d'accès au fichier et le nom du fichier. Si aucune option -n n'est définie, xargs traitera autant d'éléments d'entrée que possible en une seule exécution.
la source
Je ne sais pas si vous le pouvez ou comment le faire avec xargs.
Mais quelque chose comme ça devrait fonctionner pour vous:
la source
Une alternative à la réponse de Zoredache en utilisant la liaison de noms (et en utilisant différents séparateurs pour éviter le problème d'espaces dans les noms de fichiers):
Bien sûr, vous pouvez également utiliser les séparateurs avec l'
find -a array
argument que l'autre réponse avait utilisé, mais les arguments nommés sont parfois plus compréhensibles.la source
Vous pouvez exécuter ffmpeg directement à partir de la commande find comme ceci:
Notez les guillemets autour des paramètres de ffmpeg, au cas où il y aurait des espaces dans le nom de fichier, et le point-virgule échappé marque la fin de la commande exécutée.
la source