Eu estou procurando uma maneira de obter find
e 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, xargs
retira aspas, não importa o que eu tente.
Isso faz com lame
que (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 find
a -exec
opção (que funcionaria sem xargs
), explicitamente não estou interessado nisso, pois desejo executar 8 instâncias paralelas de lame
uma 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 lame
no final desse comando, ele será considerado path/01.01
como entrada, foo
como saída, e reclamará de que há um bar.mp3
argumento 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
-print0
comprintf
e\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 ...
Respostas:
Uso recomendado:
... se você diz
-print0
para encontrar, precisa-0
de 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 -printf
e, finalmente, anexo| bash
a ele.fonte
lame
.find -printf
com\"
aspas adicionadas e passe para o bash como eu disse acima.xargs
é que ele me permite executar 8 tarefas em 8 núcleos,bash
pois eu poderia executá-las em série ou dividir 1.800 processos, nenhum dos quais é bom. Adicionando\"
comprintf
certeza faz o trabalho, masxargs
retira-os. Ele também retira\"\"
ou'\"
ou\"'
, que é o meu problema.GNU parallell
para usar o multiprocessamento. Faz o mesmo que xargs, você pode ter melhor sorte com ele. Como eu disse, xargs às vezes faz coisas tolas.Se um futuro leitor precisar de uma solução que funcione no CygWin com o GNU Parallel:
fonte