como substituir “/” em um nome de arquivo para “_”

1

Estou criando um arquivo tar de backup de cada ponto de montagem:

/var
/usr/image
/usr/image/temp

Estou tentando criar tarnames como

backup_var_date.tar
backup_usr_image_date.tar
backup_usr_image_temp_date.tar

Tentando algo como abaixo, mas "mv" não está funcionando "$ i é uma variável chamando por loop"

/bin/tar -cvpzf backup_'echo'mv "$i" "${i//"/"/_}''_'hostname'.'date +%m.%d.%Y'.tar.gz 
    
por abhi 17.05.2017 / 15:16

2 respostas

3

Isso parece estranho:

backup_'echo'mv "$i" "${i//"/"/_}''_'hostname'.'date +%m.%d.%Y'.tar.gz 

Você está tentando aninhar mv em echo aqui? A sintaxe $(...) para substituição de comandos facilitaria o aninhamento:

backup_$(echo $(mv this that))_$(hostname)...

Mas ainda não vejo nenhum uso para mv aqui, e muito menos o echo que apenas repetiria o que mv produzia, e não deveria produzir nada se funcionasse.

Podemos apenas anular o mv e criar o nome do arquivo com ${var//\//_} , o que alteraria todas as instâncias de / na variável com _ .

Talvez algo assim, então, para todo o ciclo:

for path in /var /usr/image /usr/image/temp ; do
    x=$(path#/}                      # remove leading / if there is one
    tarfile=backup_${x//\//_}_$(hostname)_$(date +%Y-%m-%d).tar.gz
    tar -cvpzf "$tarfile" "$path"
done

Observação: alterei o formato de data de 05-17-2017 para 2017-05-17 porque o último torna a classificação mais fácil. Remover o / inicial é redundante, já que ele seria transformado em _ , o que queríamos mesmo assim, mas acho que é mais estruturado dessa maneira.

    
por 17.05.2017 / 15:27
3

Você precisa ter cuidado com a fuga. Use:

"${i//\//_}"
    
por 17.05.2017 / 15:19