Tocar problema: Criando um nome de arquivo a partir de 2 variáveis

3

Estou tentando criar um nome de arquivo a partir de 2 variáveis.

Esta é a mensagem de erro:

touch: cannot touch '/root/tinstalls/2--06/06/15': No such file or directory
2--06/06/15 19:54

Este é o código:

tdate=$(date '+%D %R')
tfile=$(echo "${toadd}--${tdate}")
touch /root/tinstalls/${tfile}

 echo $tfile

O diretório está lá.

    
por noscrodamus 07.06.2015 / 05:03

4 respostas

8

@Theophrastus tem a idéia certa. De acordo com POSIX " [os caracteres que compõem o nome [file] podem ser selecionados a partir do conjunto de todos os valores de caracteres excluindo o caractere de barra e o byte nulo "(minha ênfase). Em outras palavras, cada string entre duas barras ( exceto a string vazia ) é outro diretório, e você não pode criar um arquivo com um nome que contenha barras. Então, quando você tenta touch /root/tinstalls/2--06/06/15 , o sistema está tentando criar o arquivo 15 dentro do diretório com o caminho absoluto /root/tinstalls/2--06/06 .

Uma maneira simples de corrigir isso seria substituir todas as barras no nome do arquivo, por exemplo, com sublinhado:

touch "/root/tinstalls/${tfile//\//_}"
    
por 07.06.2015 / 12:37
2

toque não pode criar diretórios. Por exemplo veja aqui

Eu vejo que você tem "O diretório está lá." mas você percebe que seu formato de data inclui caracteres "/" que exigiriam mais diretórios, sim?

    
por 07.06.2015 / 05:13
2

Como outros já explicaram, o problema é que as barras no seu date make touch tentam criar um diretório. Como não pode, reclama. A solução mais simples é alterar o formato da data. Em vez disso:

$ date '+%D %R'
06/07/15 13:47

Use isto:

 $ date '+%F %R'
 2015-06-07 13:52

Ou, melhor ainda, evite ter que lidar com espaços e usar isso:

$ date '+%F-%R'
2015-06-07-13:52

Finalmente, se você insiste em ter espaços, você deve citar o nome ao passar para touch

touch /root/tinstalls/"${toadd}--$(date '+%F %R')"
    
por 07.06.2015 / 12:54
0

@Theophrastus tem a ideia certa. De acordo com POSIX "os caracteres que compõem o nome [arquivo] podem ser selecionados do conjunto de todos os valores de caractere, excluindo o caractere de barra eo byte nulo" (minha ênfase). Em outras palavras, cada string entre duas barras (exceto a string vazia) é outro diretório, e você não pode criar um arquivo com um nome contendo barras. Então, quando você tenta tocar / root / tinstalls / 2--06 / 06/15, o sistema está tentando criar o arquivo 15 dentro do diretório com o caminho absoluto /root/tinstalls/2--06/06.

Uma maneira simples de corrigir isso seria substituir todas as barras no nome do arquivo, por exemplo, com sublinhado:

touch "/root/tinstalls/${tfile//\//_}"
    
por 10.06.2015 / 06:11