Preciso converter vídeos, mas não sei onde eles estão, por isso preciso find
deles. Como posso dar o resultado e um nome de arquivo de saída para FFmpeg com xargs
?
Eu já descobri que posso construir os dois parâmetros com este comando:
find . -iname "*.mov" -printf "%p %f\n"
Não consigo encontrar nada relacionado no xargs
manual. Eu quero algo como isto:
find . -iname "*.mov" -printf "%p %f\n" | xargs ffmpeg -i {param1} -f flv {param2}
Como posso fazer isso?
command-line
bash
xargs
command-line-arguments
kissgyorgy
fonte
fonte
xargs
em geral podem querer consultar stackoverflow.com/questions/3770432/… .Respostas:
Algo assim fará o truque e preservará o caminho completo, manipulará o espaço, renomeará
folder/movie.mov
parafolder/movie.flv
etc.E se eu o entendi errado e você deseja todos os filmes .flv no diretório atual, use este:
fonte
O motivo pelo qual as pessoas usam
xargs
em combinação com o find é que vários nomes de arquivos serão passados para a mesma chamada de programa de qualquer programaxargs
iniciado. Por exemplo, sefind
retornar os arquivos foo , bar e baz , o seguinte será executadomv
apenas uma vez:Efetivamente, ele chama
mv
da seguinte maneira:Se você não precisa ou deseja esse comportamento (como eu assumo é o caso aqui), você pode simplesmente usar
find
's-exec
.Nesse caso, uma solução fácil seria escrever um script de shell curto, como o seguinte:
Salve como
myffmpeg.sh
e executechmod +x myffmpeg.sh
. Em seguida, execute o seguinte:Isso chamará o script de shell uma vez para cada arquivo encontrado. O script de shell, por sua vez, extrai o nome do arquivo do caminho completo e chama
ffmpeg
com os argumentos apropriados.fonte
Não obtive a solução que esperava, então descobri a minha. A resposta de @ Daniel é boa, mas precisa de um script de shell. Um liner é mais rápido, e eu gosto mais :) também solução mais simples do que escrever um script.
Eu poderia usar um argumento e processá-lo com
basename
e usandosh -c
O -i diz ao xargs para substituir
{}
o argumento atual.A saída de comando dentro de `` impressa na saída padrão (recurso bash)
basename {}
será avaliada como o nome do arquivo e impressa.-0 para manipular nomes de arquivos especiais corretamente, mas você precisa passar parâmetros com a opção -print0 com find
fonte
Você precisa fazer isso como todas as respostas, mas o uso exato do xargs será algo como isto:
Portanto, no seu caso, será:
PS: Isso responde à pergunta sobre xargs para quem está procurando uma resposta exatamente para vários
xargs
parâmetros em umxargs
comando.fonte
Por que não simplesmente mover as opções do ffmpeg para ajustar o formato dos resultados no comando find ?
Observe a adição da opção -r ao xargs para impedir a execução do ffmpeg se nenhum arquivo .mov for encontrado.
Eu adicionei o N2 opção para xargs para limitar o número de itens xargs processos para dois de cada vez. Nesse caso, os itens são o caminho e o nome do arquivo. Se nenhuma opção -n estiver definida, o xargs processará o maior número possível de itens de entrada em uma única execução.
fonte
Não tenho certeza se você pode ou como fazer isso com xargs.
Mas algo assim deve funcionar para você:
fonte
Uma alternativa à resposta do Zoredache usando a associação de nomes (e usando diferentes separadores para evitar a questão de espaços nos nomes dos arquivos):
Obviamente, você também pode usar os separadores com o
find -a array
argumento usado pela outra resposta, mas às vezes os argumentos nomeados são mais compreensíveis.fonte
Você pode executar o ffmpeg diretamente no comando find desta maneira:
Observe as aspas ao redor dos parâmetros em ffmpeg, caso haja espaços no nome do arquivo, e o ponto-e-vírgula escapado marca o final do comando executado.
fonte