find / xargs, nomes de arquivos com espaços e aspas

0

Eu estou procurando uma maneira de obter finde xargs(GNUWin32, no Win7, ambos os programas na versão 4.1) para jogar junto, com nomes de arquivos que contêm espaços.

Obtendo os nomes de arquivos em xargs que um era um desafio, mas eu parecem encontrar nenhuma maneira de fazê-los para fora em uma peça. Infelizmente, xargsretira aspas, não importa o que eu tente.
Isso faz com lameque (da qual deve ser chamado xargs) se queixe de argumentos supérfluos, pois os nomes de arquivos contêm espaços.

Sim, eu conheço finda -execopção (que funcionaria sem xargs), explicitamente não estou interessado nisso, pois desejo executar 8 instâncias paralelas de lameuma tarefa em lote intensivamente computacional (recodifique aproximadamente 1.800 audiobooks de 192kbit / s mp3s para caber no cartão micro-SD do meu aparelho). Isto é xargs -P 8.

Este comando:

find . -name "*.mp3" -printf "\"%P\" --abr 52 -q 0 --silent \"conv/%P\" " | xargs -n 7

produzirá algo semelhante a:

path/01.01 foo bar.mp3 --abr 52 -q 0 --silent conv/path/path/01.01 foo bar.mp3

... que ainda não possui aspas, portanto, se eu colocar lameno final desse comando, ele será considerado path/01.01como entrada, foocomo saída, e reclamará de que há um bar.mp3argumento supérfluo .

  • Eu tentei adicionar apóstrofos (entre as aspas e dentro delas), mas o `xargs" também as remove.
  • -print0 também não fará (pelo menos por qualquer coisa que eu tentei).
  • Eu tentei simular -print0com printfe \0, sem sucesso.
  • Enquanto isso, estou brincando com a idéia de redirecionar a saída para um arquivo e adicionar as aspas com um editor de texto ...
Damon
fonte
Acabou redirecionando tudo para um arquivo, dividindo o arquivo em 8 partes e executando as 8 partes em paralelo manualmente.
Damon

Respostas:

1

Uso recomendado:

encontre ... -print0 | xargs -0 ...

... se você diz -print0para encontrar, precisa -0de xargs.

Pelo que vale, muitas vezes considero o xargs um incômodo - nesses casos, tomo o cuidado de criar os comandos exatos com os quais quero executar find -printfe, finalmente, anexo | basha ele.

Hannu
fonte
Consciente dessa bandeira, mas isso também não vai funcionar, infelizmente, ainda precisa de aspas lame.
Damon
Tente find -printfcom \"aspas adicionadas e passe para o bash como eu disse acima.
Hannu
Bem, o ponto principal xargsé que ele me permite executar 8 tarefas em 8 núcleos, bashpois eu poderia executá-las em série ou dividir 1.800 processos, nenhum dos quais é bom. Adicionando \"com printfcerteza faz o trabalho, mas xargsretira-os. Ele também retira \"\"ou '\"ou \"', que é o meu problema.
Damon
11
Procure Ole Tange GNU parallellpara usar o multiprocessamento. Faz o mesmo que xargs, você pode ter melhor sorte com ele. Como eu disse, xargs às vezes faz coisas tolas.
Hannu
Dado que o Windows e o Perl não estão instalados, infelizmente essa não é uma opção, foi feita manualmente dividindo um arquivo.
Damon
0

Se um futuro leitor precisar de uma solução que funcione no CygWin com o GNU Parallel:

find . -name "*.mp3" | parallel lame {} --abr 52 -q 0 --silent conv/{}
Ole Tange
fonte