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 find
retornar 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 find
para que eu possa canalizar a seqüência de nomes de arquivos diretamente para outro programa.
find
formata 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. .
find
oferecer uma opção para gerar nomes de arquivos em um formato adequado para o shell. Em geral, porém, a extensão -print0
GNU find
funciona 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 $IFS
para 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$HOME
se 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?
-exec
bandeira comfind
? você pode potencialmente aliviar esse erro e tornar seu comando mais eficiente, ao-exec
invés de canalizá-lo para outros comandos. Just my $ .02