Como anexar data ao arquivo de backup

62

Eu preciso fazer um backup de um arquivo e gostaria de ter um timestamp como parte do nome para facilitar a diferenciação.

Como você injetaria a data atual em um comando de cópia?

[root@mongo-test3 ~]# cp foo.txt {,.backup.'date'}
cp: target '2013}' is not a directory

[root@mongo-test3 ~]# cp foo.txt {,.backup. $((date)) }
cp: target '}' is not a directory  

[root@mongo-test3 ~]# cp foo.txt foo.backup.'date'
cp: target '2013' is not a directory
    
por spuder 17.10.2013 / 01:14

8 respostas

96

Isso não está funcionando porque o comando date retorna uma string com espaços.

$ date
Wed Oct 16 19:20:51 EDT 2013

Se você realmente deseja nomes de arquivo como esses, será necessário incluir essa string entre aspas.

$ touch "foo.backup.$(date)"

$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:22 foo.backup.Wed Oct 16 19:22:29 EDT 2013

Você provavelmente está pensando em uma string diferente para ser acrescentada seria meu palpite embora. Eu costumo usar algo assim:

$ touch "foo.backup.$(date +%F_%R)"
$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:25 foo.backup.2013-10-16_19:25

Consulte a página do manual para a data para obter mais códigos de formatação em torno da saída para a data & tempo.

Formatos adicionais

Se você quiser ter controle total se consultar a página do manual, poderá fazer coisas como esta:

$ date +"%Y%m%d"
20131016

$ date +"%Y-%m-%d"
2013-10-16

$ date +"%Y%m%d_%H%M%S"
20131016_193655
    
por 17.10.2013 / 01:25
12
cp foo.txt {,.backup.'date'}

Isso se expande para algo como cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013 . O espaço antes das chaves inicia uma nova palavra.

cp foo.txt {,.backup. $((date)) }

As chaves estão em palavras separadas, então são interpretadas literalmente. Além disso, $((…)) é a sintaxe para expansão aritmética; a saída de date não é nada como uma expressão aritmética. A substituição de comandos usa um único conjunto de parênteses: $(date) .

cp foo.txt foo.backup.'date'

Mais perto. Você poderia ter expressado isso com chaves como cp foo.{txt,.backup.'date'} . Ainda há o problema de que a saída de date contenha espaços, portanto, ele precisa ser colocado entre aspas duplas. Isso funcionaria:

cp foo.{txt,backup."'date'"}

ou

cp foo.{txt,backup."$(date)"}

O formato de saída padrão de date não é adequado para um nome de arquivo e pode até não funcionar se uma localidade usar / caracteres no formato de saída padrão. Use um formato de data Y-M-D para que a ordem lexicográfica nos nomes dos arquivos seja a ordem cronológica (e também para evitar a ambigüidade entre os formatos de data dos EUA e internacionais).

cp foo.{txt,backup."$(date +%Y%m%d-%H%M%S)"}
    
por 17.10.2013 / 02:48
6

Se você realmente quiser usar a data detalhada, você deve proteger o backtick. O com este formato de data é que ele possui espaços embutidos, um não-não em um shell Unix, a menos que você os coloque dentro de aspas (ou escape de alguma outra forma).

cp foo.txt "foo-'date'.txt"

No entanto, prefiro usar o formato ISO mais curto:

cp foo.txt foo-'date --iso'.txt
    
por 17.10.2013 / 01:25
5

Use uma função, isso facilitará sua vida. Isso é o que eu uso:

backup () { 
    for file in "$@"; do
        local new=${file}.$(date '+%Y%m%d')
        while [[ -f $new ]]; do
            new+="~";
        done;
        printf "copying '%s' to '%s'\n" "$file" "$new";
        \cp -ip "$file" "$new";
    done
}
    
por 17.10.2013 / 02:31
4

Como date tem por padrão whitespaces em sua saída, seu último comando falhou. Se você tivesse citado o último argumento dentro com " , deveria funcionar. Suas outras tentativas têm uma sintaxe errada

Aqui, uma solução possível sem espaços em branco:

cp foo.txt foo.backup.$(date --iso-8601=seconds)  

ou

cp foo.txt foo.backup.'date --iso-8601=seconds'

Se você adicionar

bk() {
     cp -a "$1" "${1}_$(date --iso-8601=seconds)"
}

para o seu .bashrc e re-login / deixe o seu bash relê-lo, você precisa apenas chamar bk file.txt .

    
por 17.10.2013 / 01:24
2

Você copia o arquivo para o arquivo de backup cujo nome é criado com o registro de data e hora anexado

cp foo.txt backup_'date +"%d-%m-%Y"'.txt

OR:

Você pode exibir o conteúdo do arquivo usando "cat" e redirecionar a saída para o arquivo de backup cujo nome é criado com o registro de data e hora anexado

cat foo.txt > backup_'date +"%d-%m-%Y"'.txt

Você também pode usar mais opções de controles FORMAT conforme sua necessidade Por exemplo:% H,% M,% S, etc.

    
por 26.04.2016 / 15:22
1

No bash você pode digitar:

cp /path/to/long/filename !#$_$(date +Is)

Que se expande para:

cp /path/to/long/filename /path/to/long/filename_$(date +Is)

Como resultado:

$ ls /path/to/long/filename*
filename  filename_2017-05-10T11:50:10+0300

A carne sendo date -Is . Eu gosto de usá-lo porque é fácil de lembrar, tipo e permite versões curtas (como -In se você for louco por precisão).

! inicia um designador de evento:

 !#     The entire command line typed so far.

E $ é um designador de palavras:

   $      The last word.  This is usually the last argument, but will expand to the zeroth word if there is only one word in the line.
    
por 10.05.2017 / 11:01
1

Quando eu tenho que fazer um backup de um arquivo eu costumo fazê-lo desta maneira.

cp foo.txt foo.backup.$(date +%F).txt

ls -l

foo.txt foo.backup.2017-9-19.txt

    
por 19.09.2017 / 19:19

Tags