Manipular nome do arquivo com espaço em branco no shellscript

1

Estas são minhas estruturas de pastas.

[set symbolic links here]
/links/

[entity]    
/data/a 1/  #(folder name has blank)
/data/b 1/
/data/c 1/
/data/d 1/
.
.
.

Eu quero fazer um link simbólico para cada entidade de uma vez por shellscript.

for file in /data/*; do
    echo "${file}"
   ln -ds "/data/${file}" "/links/${file}"
done

No entanto, mostra o erro como este.

/data/a 1
ln: failed to create symbolic link '/data//links/a 1': No such file or directory

Eu acho que é relevante com espaços em branco no nome da pasta .... ???

Como posso resolver isso?

    
por whitebear 27.06.2018 / 05:29

1 resposta

1

Tem certeza de que é /data//links/a 1 na mensagem de erro? Eu esperaria /links//data/a 1

Blanks não são o problema. Veja o que seu echo deu a você. Seu $file já contém /data/ string. O pedaço de código

"/data/${file}" "/links/${file}"

adiciona /data/ ou /links/ a uma string onde /data/ já é.

A solução mais fácil é tornar $file não contendo /data/ :

cd /data
for file in *; do
# the rest of your script
# in general remember you're in a different dir now

Como alternativa, você pode manter for file in /data/*; e remover a parte excessiva mais tarde:

for file in /data/*; do
file=$(basename "$file")
# the rest of your script

A solução acima gerará vários processos porque basename é um executável separado. Por esse motivo, você pode querer que o trabalho seja feito pelo próprio shell:

for file in /data/*; do
file="${file##*/}"
# the rest of your script

A sintaxe ${file##*/} imprime $file , mas remove a string mais longa que corresponde a */ da frente dela. O efeito é que lhe dá o que quer que exista após o último / .

    
por 27.06.2018 / 09:02