A expansão do brace não funciona

0

No Bash, quero renomear um arquivo para que o prefixo até - seja removido, mas por que ele não funciona com a expansão de chaves?

$ ls
Thomas Anderson, Michael Dahlin-Operating Systems

$ mv {Thomas\ Anderson,\ Michael\ Dahlin-,}Operating\ Systems
mv: target ‘Operating Systems’ is not a directory
    
por Tim 13.04.2016 / 03:57

2 respostas

1

Seu arquivo contém , , que é especial para ajustar a expansão, portanto, sua expansão de chave expandida para 3 strings, em vez de duas, conforme você pretende.

Você pode tentar:

$ printf '%s\n' {Thomas\ Anderson,\ Michael\ Dahlin-,}Operating\ Systems
Thomas AndersonOperating Systems
 Michael Dahlin-Operating Systems
Operating Systems

para ver como a expansão de chaves foi expandida.

A correção rápida está escapando do , :

$ printf '%s\n' {Thomas\ Anderson\,\ Michael\ Dahlin-,}Operating\ Systems
Thomas Anderson, Michael Dahlin-Operating Systems
Operating Systems
    
por 13.04.2016 / 04:05
1

Talvez a maneira mais fácil seja usar printf e set -- .

Apenas a versão curta:

$ set -- {"Thomas Anderson, Michael Dahlin-",}"Operating Systems"
$ mv "$@"
$ ls
Operating Systems  

Ou a descrição mais detalhada: O original não é o que você quer:

$ printf '%s\n' {Thomas\ Anderson,\ Michael\ Dahlin-,}Operating\ Systems
Thomas AndersonOperating Systems
 Michael Dahlin-Operating Systems
Operating Systems

Quando se torna o que você quer (a citação é a maneira mais fácil):

$ printf '%s\n' {"Thomas Anderson, Michael Dahlin-",}"Operating Systems"
Thomas Anderson, Michael Dahlin-Operating Systems
Operating Systems

Basta alterar o printf para set -- e usar mv "$@"

$ mkdir mydir
$ cd mydir
$ touch 'Thomas Anderson, Michael Dahlin-Operating Systems'
$ ls
Thomas Anderson, Michael Dahlin-Operating Systems
$ printf '%s\n' {"Thomas Anderson, Michael Dahlin-",}"Operating Systems"
Thomas Anderson, Michael Dahlin-
Operating Systems
$ set -- {"Thomas Anderson, Michael Dahlin-",}"Operating Systems"
$ printf '%s\n' "$@"
Thomas Anderson, Michael Dahlin-
Operating Systems
$ mv "$@"
$ ls
Operating Systems
    
por 13.04.2016 / 04:55

Tags