Isso não está funcionando porque o comando date
retorna uma cadeia de caracteres com espaços.
$ date
Wed Oct 16 19:20:51 EDT 2013
Se você realmente quiser nomes de arquivos assim, precisará colocar essa sequência 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 sequência diferente a ser acrescentada, seria o meu palpite. Eu costumo usar algo como isto:
$ 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 e hora.
Formatos adicionais
Se você quiser assumir o controle total, se consultar a página de manual, poderá fazer coisas como estas:
$ date +"%Y%m%d"
20131016
$ date +"%Y-%m-%d"
2013-10-16
$ date +"%Y%m%d_%H%M%S"
20131016_193655
NOTA: Você pode usar date -I
ou date --iso-8601
que produzirá uma saída idêntica à date +"%Y-%m-%d
. Essa opção também pode usar um argumento para indicar vários formatos de hora :
$ date -I=?
date: invalid argument ‘=?’ for ‘--iso-8601’
Valid arguments are:
- ‘hours’
- ‘minutes’
- ‘date’
- ‘seconds’
- ‘ns’
Try 'date --help' for more information.
Exemplos:
$ date -Ihours
2019-10-25T01+0000
$ date -Iminutes
2019-10-25T01:21+0000
$ date -Iseconds
2019-10-25T01:21:33+0000
touch foo`date +%F`
também funciona bem.csh
shell...
) em vez de$(..)
. Os shells C aparentemente não suportam essa notação para subshells.date +"%Y-%m-%d"
é o mesmo quedate -I
. Eu recomment os formatos ISO de qualquer maneira. A precisão pode ser especificada adicionando horas, minutos, segundos ou ns ao parâmetro-I
. Exemplodate -Iseconds
.Isso se expande para algo parecido
cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013
. O espaço antes do aparelho inicia uma nova palavra.Os aparelhos estão em palavras separadas, então eles são interpretados literalmente. Além disso,
$((…))
é a sintaxe da expansão aritmética; a saída dedate
nada se parece com uma expressão aritmética. Substituição de comando usa um único conjunto de parênteses:$(date)
.Mais perto. Você poderia ter expressado isso com chaves como
cp foo.{txt,.backup.`date`}
. Ainda existe o problema de a saídadate
conter espaços, portanto ela precisa ser colocada entre aspas duplas. Isso funcionaria:ou
O formato de saída padrão de
date
não é adequado para um nome de arquivo e pode até não funcionar se um código de idioma usar/
caracteres no formato de saída padrão. Use um formato de data YMD para que a ordem lexicográfica nos nomes dos arquivos seja a ordem cronológica (e também para evitar ambiguidade entre os formatos de data americano e internacional).fonte
Se você realmente deseja usar a data detalhada, deve proteger o backtick. O formato com esta data é que ele possui espaços incorporados, um não-não em um shell Unix, a menos que você os coloque dentro de aspas (ou escape de alguma outra maneira).
No entanto, prefiro usar o formato ISO mais curto:
fonte
Use uma função, isso facilitará sua vida. Isto é o que eu uso:
fonte
Como
date
, por padrão, os espaços em branco em sua saída, seu último comando falhou. Se você citou o último argumento interno"
, ele deve funcionar. Suas outras tentativas têm sintaxe incorretaAqui uma solução possível sem espaços em branco:
ou
Se você adicionar
para o seu
.bashrc
e faça o login novamente / deixe o bash reler, basta ligarbk file.txt
.fonte
--iso-8601
opção, então coloquei o link aqui. Opções de data do GNU: --iso-8601Você copia o arquivo para o arquivo de backup cujo nome é criado com carimbo de data / hora anexado
OU:
Você pode exibir o conteúdo do arquivo usando "cat" e redirecionar a saída para o arquivo de backup cujo nome é criado com carimbo de data / hora anexado
Você também pode usar mais opções de controles FORMAT conforme sua necessidade, por exemplo:% H,% M,% S, etc.
fonte
cat
redirecionamentocp
?Quando tenho que fazer um backup de um arquivo, geralmente faço dessa maneira.
cp foo.txt foo.backup.$(date +%F).txt
ls -l
foo.txt foo.backup.2017-9-19.txt
fonte
%F
formato da data produz meses de 2 dígitos els -l
geralmente fornece um pouco mais de informações do que apenas nomes de arquivos.No bash, você pode digitar:
O que se expande para:
Resultando em:
A carne sendo
date -Is
. Eu gosto de usá-lo porque é fácil de lembrar, digitar e permitir versões curtas (como-In
se você fosse maníaco por precisão).!
inicia um designador de evento:E
$
é um designador de palavras:fonte
Se você deseja apenas um backup do arquivo ou diretório, por que digitar o destino também, basta usar a expansão do shell para adicionar a data ao final do nome do arquivo da cópia.
ie
o que resulta em
ou simplesmente use
Anexe a data para atender às suas necessidades. :)
fonte