Script bash: mv + variáveis + arquivos com nomes incomuns

Olá, meus amigos.

Estou com dificuldades para refinar um script bash, onde há duas variáveis $a e $b que armazenam caminhos absolutos de diretórios e preciso mover arquivos de $b para $a.
Tipo: mv $b/* $a
Porém, um problema que não consigo resolver é que estes caminhos podem conter caracteres de espaços ou outros caracteres bizarros (já encontrei coraçõezinhos…). Ok, vamos ficar apenas com os espaços…

Eu já tentei usar mv “$b/*” “$a” com aspas simples, duplas, etc e nada deu certo.

Eu fiz um debug usando echo para imprimir o que de fato $a ou $b armazenam e sai algo como, por exemplo:

/home/user/temp/pasta 1/pasta 11 /arquivo de trabalho.txt

O erro gerado pelo mv $b/* $a diz que diretório /home/user/temp/pasta não existe. Ou seja, não pegou o caminho todo… quebrou no primeiro espaço.
Quando uso aspas, apóstrofe, etc, pelo que entendi ela assume isto como se fosse parte do caminho e não um encapsulamento…

Como eu lido com isto? Tem como encapsular o caminho para passar para o mv? Tem outra formar?

Obrigado!

Na hora de setar a váriavel com o caminho da pasta você está colocando o valor dentro de aspas duplas para a shell entender que os espaços fazem parte da string? Como b="/home/user/temp/pasta 1/pasta 11"
E se continuar tendo problema, na hora da expanção já tentou deixar o englobamento fora das aspas? mv "$b/"* "$a"

Só deixar o $b dentro das aspas e o * fora das aspas. O / pode ficar dentro ou fora, depende do seu gosto.

Você pode fazer várias misturebas com aspas no shell tipo "$b"'$b', "$b"/*' (1).png', eles serão concatenadas antes do caracteres especiais sem aspas serem interpretados.

Isso não afeta o problema, os caracteres especiais (inclusive aspas) são interpretados novamente ao usar $b (ou qualquer outra variável) fora de aspas.

1 curtida

O que eu quis dizer é que por exemplo b=a c vai setar o valor de b para apenas a e então vai tentar executar c como se fosse outro comando, por isso utilizar b="a c" pra manter toda a string como valor da variável

@KaMyKaSii e @Capezotte

As variáveis estavam setadas como, por exemplo, b=“$PWD”.
Eu alterei o script para ficar como:

mv "$b"/* "$a"

e funcionou corretamente.

Não sei mais o que eu estava fazendo errado. Provavelmente, "$b/", colocando o / dentro das aspas não funciona… ?

Obrigado pela ajuda de ambos!!!

O problema era o * estar dentro das aspas.

Eu tenho script seguindo os dois estilos e todos funcionam com nomes “complicados”.

Este tópico foi fechado automaticamente 3 dias depois da última resposta. Novas respostas não são mais permitidas.