Tenho um arquivo que contém espaços em branco no nome: my file.txt
.
Se eu quiser encontrar um arquivo com esse nome e canalizar sua saída para um vim com args
, devo usar --null|-0
para manipular espaços em branco corretamente:
find . -iname "my*file.txt" | xargs --null vim
O problema é que o nome do arquivo que é passado para o comando é my file.txt^@
.
Este ^@
é o caractere nulo no vim.
Então como posso passar o my file.txt
arquivo de find
ou fzf
para o vim?
Normalmente, você não faz isso. Quero dizer, claro, você pode brincar com
-print0
e depois-0
comxargs
, mas por quê? Basta usar a opçãofind
de-exec
que é projetada para esse tipo de coisa. Deman find
:Então você pode fazer isso para abrir apenas um arquivo:
Ou, se você tiver muitos arquivos correspondentes e quiser abrir todos eles:
No seu caso, ficaria assim:
Se você tivesse que usar
xargs
, exargs
por acaso fosse o seu, o GNU findutils, de um shell com suporte para substituição de processos no estilo Korn, o equivalente seria algo como:Onde:
-print0
para corresponder ao formato esperado porxargs -0
(equivalente padrão dexargs --null
).-r
para evitar executarvim
sem argumento se não houver nenhum arquivo correspondente.-a
vez dexargs
stdin para preservarvim
o stdin de .find
O separador de 's é, por padrão, uma nova linha\n
.Da página do manual:
Então você deve ou
xargs
para usar\n
como separador:find
para usarnull
o caractere como separador:Novamente, da página do manual: