Acrescentar uma data atual de uma variável a um nome de arquivo

48

Estou tentando acrescentar a data atual ao final de um nome de arquivo como este:

TheFile.log.2012-02-11

Aqui está o que eu tenho até agora:

set today = 'date +%Y'
mkdir -p The_Logs &
find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; &

No entanto, tudo que eu obtenho é o nome do arquivo e ele não acrescenta nada. Como faço para acrescentar uma data atual a um nome de arquivo?

    
por I AM L 05.12.2012 / 00:27

5 respostas

70

Mais do que provavelmente é o seu uso de set . Isso atribuirá 'today', '=' e a saída do programa date aos parâmetros posicionais (também conhecidos como argumentos de linha de comando). Você quer apenas usar shell C (que você está marcando isso como "bash", provavelmente não), você vai querer usar:

today='date +%Y-%m-%d.%H:%M:%S' # or whatever pattern you desire

Observe a falta de espaços ao redor do sinal de igual.

Você também não quer usar & no final de suas declarações; que faz com que o shell não espere o comando terminar. Especialmente quando se confia no próximo. O comando find pode falhar porque é iniciado antes do mkdir .

    
por 05.12.2012 / 00:35
49

Script Bash para injetar uma data em um nome de arquivo:

Este código bash no arquivo chamado a.sh

#!/bin/bash
today='date '+%Y_%m_%d__%H_%M_%S'';
filename="/home/el/myfile/$today.ponies"
echo $filename;

Quando executado, imprime:

eric@dev ~ $ chmod +x a.sh

eric@dev ~ $ ./a.sh
/home/el/myfile/2014_08_11__15_55_25.ponies

Explicação do código:

Interprete o script com o interpretador / bin / bash. Faça uma nova variável chamada hoje. Execute o comando date, passando os flags Y, m, d, H, M, S para configurar a saída. Coloque o resultado na variável de data.

Crie uma nova variável chamada filename, coloque a variável $ today com o resto do texto estático do nome do arquivo. em seguida, ecoar o nome do arquivo para a tela.

Enrole-o em um verso para aumentar o lulz:

echo "/home/el/myfile/'date '+%Y_%m_%d__%H_%M_%S''.ponies"
    
por 11.08.2014 / 21:58
4

Você parece ter misturado várias coisas.

set today = 'date +%Y' se parece com a sintaxe tcsh, mas mesmo em tcsh ele atribui a string date +%Y à variável today , ele não executa o comando date . Como você provavelmente está usando bash ou algum outro shell POSIX, a sintaxe de uma atribuição é today=some_value (sem espaços ao redor do sinal de igual). Para executar o comando e atribuir sua saída à variável, use a substituição de comando :

today=$(date +%Y-%m-%d)

(Eu também completei a especificação da data). Você pode usar backquotes em vez de parênteses em dólar, mas é propenso a ficar visualmente confuso com aspas, e as regras para quando você precisa de cotações dentro de um comando backquoted são muito complexas e dependentes de implementação, então é melhor não ficar com $(…) (que tem o mesmo efeito com uma sintaxe mais segura).

Você usou & no final de vários comandos. Isso faz com que o comando seja executado em segundo plano, o que não é desejado aqui. Eu suspeito que você quis dizer && , o que significa executar o próximo comando somente se o primeiro comando for bem sucedido.

today=$(date +%Y-%m-%d)
mkdir -p The_Logs &&
find …

Uma alternativa ao uso de && após cada comando é iniciar seu script com set -e . Isso faz com que o shell pare de executar o script assim que qualquer comando retornar um status diferente de zero (exceto os comandos em if conditions e alguns outros casos).

set -e
today=$(date +%Y-%m-%d)
mkdir -p The_Logs
find …

Seu comando find está bom, mas provavelmente não faz o que você pretende fazer (embora eu não saiba ao certo o que é isso).

Você está criando um diretório com mkdir e, em seguida, percorrendo-o imediatamente com find . Isso não será útil, a menos que o diretório já exista. Você quis criar um diretório para os registros de hoje e mover os arquivos recentes de The_Logs para um diretório chamado, por exemplo, The_Logs.2012-02-11 ?

mkdir -p "The_Logs.$today"
find The_Logs -mtime -1 -exec mv {} "The_Logs.$today" \;

Ou você quis renomear os arquivos de log de hoje para adicionar o sufixo $today ? Isso requer o cálculo do nome de arquivo diferente para cada arquivo a ser movido.

find The_Logs -mtime -1 -exec sh -c 'mv "$0" "$0.$today"' {} \;

Observe que usei -mtime para mover arquivos com base no tempo de modificação deles, e não em -atime , que é a hora em que o arquivo foi lido pela última vez (se o seu sistema mantiver controle disso, o atime pode ser tão antigo quanto o mtime).

    
por 05.12.2012 / 01:31
3

Você pode renomear o arquivo com o registro de data e hora anexado a ele

mv TheFile.log TheFile.log.'date +"%d-%m-%Y"'
    
por 26.04.2016 / 15:28
1

Isto:

find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &

deve funcionar. Embora, parece que você está usando csh e minha solução de remover o sinal + pode não funcionar para você, mas não vai doer tentar. Colocar sua variável em chaves {{} é sempre uma boa ideia para evitar expansões inesperadas de variáveis.

    
por 05.12.2012 / 00:33