Quero canalizar nomes de arquivos para outros programas, mas todos eles sufocam quando os nomes contêm espaços.
Digamos que eu tenho um arquivo chamado.
foo bar
Como posso findretornar o nome correto?
Obviamente eu quero:
foo\ bar
ou:
"foo bar"
Edição : Eu não quero passar xargs, eu quero obter uma seqüência de caracteres formatada corretamente findpara que eu possa canalizar a seqüência de nomes de arquivos diretamente para outro programa.
findformata os nomes dos arquivos; eles são escritos um nome por linha. (Obviamente, isso é ambíguo se um nome de arquivo contiver um caractere de nova linha.) Portanto, o problema é o final de recebimento "sufocado" quando obtém um espaço, o que significa que você precisa nos dizer qual é o final de recebimento se quiser uma resposta significativa. .
findoferecer uma opção para gerar nomes de arquivos em um formato adequado para o shell. Em geral, porém, a extensão -print0GNU findfunciona bem para muitos outros cenários (também), e você deve aprender a usá-la em qualquer caso.
ls $(command...)não alimenta a lista stdin. Ele coloca a saída $(command...)diretamente na linha de comando. Nesse caso, é o shell que está lendo a partir de c e usará o valor atual de $IFSpara decidir como dividir a saída em palavras. Em geral, é melhor usar xargs. Você não notará um impacto no desempenho.
find -printf '"%p"\n'adicionará aspas duplas ao redor de cada nome encontrado, mas não citará corretamente aspas duplas no nome de um arquivo. Se os nomes de arquivo não tem nenhum aspas duplas incorporadas, você pode ignorar o problema: ou tubo através sed 's/"/&&/g;s/^""/"/;s/""$/"/'. Se os nomes dos arquivos acabarem sendo manipulados pelo shell, provavelmente você deve usar aspas simples em vez de aspas duplas (caso contrário, sweet$HOMEse tornará algo parecido sheet/home/you). E isso ainda não é muito robusto em relação aos nomes de arquivos com novas linhas. Como você quer lidar com isso?
-execbandeira comfind? você pode potencialmente aliviar esse erro e tornar seu comando mais eficiente, ao-execinvés de canalizá-lo para outros comandos. Just my $ .02