Nomes de arquivos com espaços na substituição de backtick

4

Suponha que eu tenha um arquivo contendo um espaço em seu nome, como with space . O que deve cmd produzir no trecho abaixo para ls para aceitar 'com espaço' como argumento?

$ ls 'cmd'

Eu tentei ls 'echo 'with space'' . Os argumentos transmitidos para ls são 'with e space' . Tentar escapar do espaço usando a barra invertida também não funciona. Eu vejo que usando ls "'cmd'" funciona. Mas, isso não funciona se eu quiser passar vários arquivos como argumento para ls com alguns espaços possivelmente contidos.

O manual sobre substituição de comandos também parece esparso. link

Mais geralmente, qual é o formato de saída a ser seguido pelo cmd se ele deseja produzir uma lista de arquivos que podem ser substituídos para serem usados por outro comando usando a substituição de backtick?

    
por Balagopal Komarath 04.06.2017 / 17:09

1 resposta

4

I see that using ls "'cmd'" works. But, this does not work if I want to pass multiple files as argument to ls with some possibly containing spaces.

Está correto. É o mesmo problema com o armazenamento de comandos em uma variável (discutido por exemplo, aqui ), não pode ser feito agradável. As opções que vêm à mente são:

  • Solicite que cmd emita uma lista de nomes de arquivos separados por NUL, em seguida canalize para xargs -0 para passá-los para outro comando
  • Defina IFS para algum caractere que não apareça em nenhum nome de arquivo e tenha cmd na saída da lista de arquivos separados por
  • Solicite cmd os nomes dos arquivos corretamente citados para o shell e, em seguida, execute-o em eval .

Assim:

$ touch "with space" "another space"
$ printf "%s
$ touch "with space" "another space"
$ printf "%s%pre%" "with space" "another space" | xargs -0 ls -i
1705749 another space  1705230 with space
$ set -f; IFS=%; ls -i $(echo "with space%another space")
1705749 another space  1705230 with space
$ eval ls -i "$(echo '"with space" "another space"')"
1705749 another space  1705230 with space
" "with space" "another space" | xargs -0 ls -i 1705749 another space 1705230 with space $ set -f; IFS=%; ls -i $(echo "with space%another space") 1705749 another space 1705230 with space $ eval ls -i "$(echo '"with space" "another space"')" 1705749 another space 1705230 with space

Ou use find -exec ... se você pode substituir cmd por isso.

    
por 04.06.2017 / 18:47