2015-07-29 1 views
1

Pour convertir les fichiers MOV en MP4 dans le répertoire, j'utilisais (j'utiliser plusieurs commandes avec avconv, mais je raccourcies pour syntetize):Convertir plusieurs fichiers vidéo récursif en utilisant « trouver » et « avconv »

for f in *.MOV; do echo "Converting $f"; avconv -i "$f" "${f:0: -4}.mp4"; done 

Et ça marche. Il convertit tous les fichiers.

Mais maintenant, je veux convertir tous les fichiers dans le répertoire et tous les sous-répertoires (récursivement). J'ai essayé:

for f in "$(find ./ -name '*.MOV')"; do echo "Converting $f"; avconv -i "$f" "${f:0: -4}.mp4"; done 

Mais cela ne fonctionne pas, car il génère:

[email protected]:~/Imágenes$ for f in "$(find ./ -name '*.MOV')"; do echo "Converting $f"; avconv -i "$f" "${f:0: -4}.mp4"; done 
Converting ./2015-05-23 Tutorial Masa de colores/MVI_9219.MOV 
./2015-05-23 Tutorial Masa de colores/MVI_9196.MOV 
./2015-05-23 Tutorial Masa de colores/MVI_9199.MOV 
./2015-05-23 Tutorial Masa de colores/MVI_9200.MOV 
avconv version 9.18-6:9.18-0ubuntu0.14.04.1, Copyright (c) 2000-2014 the Libav developers built on Mar 16 2015 13:19:10 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1) 
./2015-05-23 Tutorial Masa de colores/MVI_9219.MOV 
./2015-05-23 Tutorial Masa de colores/MVI_9196.MOV 
./2015-05-23 Tutorial Masa de colores/MVI_9199.MOV 
[email protected]:~/Imágenes$ 

(liste des derniers fichiers apparaissent en rouge)

Il semble que trouver œuvres, il entre dans chaque répertoire et echo "Convertir $ f" aussi ... mais avconv reçoit tous ces noms de fichiers sous forme de liste avec newlines, pas chaque élément de la boucle "for".

Pourquoi écho fonctionne et avconv ne fonctionne pas?

Ou ...

Pourquoi for f in * .MOV » travaille avec avconv et pour f dans « $ (trouver ./ -name '* .MOV) ne fonctionne pas?

+0

Qu'est-ce que vous obtenez si vous dites 'pour f dans « $ (trouver ./ -name '* .MOV') "; fais écho "$ f"; fait? C'est-à-dire, est-ce qu'il «trouve» tous les fichiers - et seulement tous - que vous voulez traiter? – fedorqui

+0

Je reçois la liste des fichiers.MOV qui se trouvent dans le répertoire et les sous-répertoires. Tous et seulement les fichiers que je veux traiter. Comme: ./2015-05-23 Tutoriel Masa de colores/MVI_9219.MOV ./2015-05-23 Tutoriel Masa de colores/MVI_9196.MOV ... –

Répondre

1

C'est parce que vous les mettez entre guillemets dans Posix un saut de ligne peut très bien être présent dans le nom du fichier

la solution pour vous plus simple serait de réécrire en utilisant -exec attribut de trouvaille:..

find . -name "*.MTS" -exec echo {} \; -exec avconv -i {} {}.mp4 \; 

Ou encore mieux, vous pouvez utiliser -execdir pour la ligne avconv, il va exécuter la commande à partir du répertoire où le fichier est trouvé. De votre commentaire, je vois que vous avez du mal à voir d'où viennent les nouvelles lignes. Alors

De page man de trouver:

If no expression is given, the expression -print is used 

et

-print True; print the full file name on the standard output, followed 
     by a newline. 

Donc, trouver imprime en fait tous les caractères de nouvelle ligne pour vous. Vous l'appelez via $(find ...) et vous le placez entre guillemets, ce qui signifie que tous les caractères de nouvelle ligne sont conservés comme un caractère normal.

C'est pourquoi votre boucle for s'exécute une seule fois.

Si vous devez absolument utiliser une boucle, plutôt que d'utiliser propre exécution de find, vous voulez probablement utiliser une boucle while:

find . -name "*.MTS" | while read f; do echo "Converting $f"; avconv -i "$f" "${f:0: -4}.mp4"; done 
+0

Trois choses: 1.- Ceci est différent technique. Je voudrais savoir pourquoi le mien ne fonctionne pas. 2. Pourquoi vous dites "caractère de nouvelle ligne" ... alors que mes fichiers n'ont pas de saut de ligne? (ils ont seulement des espaces) 3.- Avec cette technique, comment puis-je obtenir le nom de fichier sans extension? Comme "$ {f: 0: -4} .mp4". –

+0

@MarioMey J'ai édité la réponse en fournissant quelques informations sur l'origine de la nouvelle ligne. Je vous ai également fourni un moyen de le faire dans une boucle différente (une boucle while) – v010dya

+0

Maintenant, je comprends où était la nouvelle ligne. Mais c'est tellement complexe pour moi de comprendre ces ... genre de choses sur les noms de fichiers ... Je ferai mieux de retourner à mon travail. La boucle while fonctionne très bien, seul un point-virgule est manquant avant "done". A partir de maintenant, je vais utiliser cette phrase. J'ai ajouté quelques options de codec et _gvfs-trash_ pour supprimer le fichier. Merci mec. –