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

55

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 o que recebo é o nome do arquivo e ele não acrescenta nada. Como anexar uma data atual a um nome de arquivo?

EU SOU EU
fonte
Quando você data da aplicação, certifique-se de não usá :-la, pois ela será lida como um host no rsync e scp. stackoverflow.com/a/37143274/390066
kirill_igum

Respostas:

78

Muito provavelmente é o seu uso set. Isso atribuirá 'today', '=' e a saída do dateprograma aos parâmetros posicionais (também conhecidos como argumentos da linha de comando). Você deseja apenas usar o shell C (que você está chamando de "bash", provavelmente não));

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 deseja usar &no final de suas declarações; o que faz com que o shell não espere o comando terminar. Especialmente quando um depende do próximo. O findcomando pode falhar porque é iniciado antes do mkdir.

Arcege
fonte
Obrigado por esse companheiro, está funcionando 100% bem agora, Felicidades para o heads-up & e mkdir
Eu sou L
55

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 sinalizadores 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 restante do texto estático do nome do arquivo. em seguida, faça eco do nome do arquivo na tela.

Coloque-o em uma linha para aumentar a quantidade de lulz:

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"
Eric Leschinski
fonte
5

Você parece ter misturado várias coisas.

set today = 'date +%Y'parece com a sintaxe do tcsh, mas mesmo no tcsh atribui a string date +%Yà variável today, ele não executa o datecomando. Como você provavelmente está usando o 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)

(Também completei a especificação da data). Você pode usar aspas duplas em vez de parênteses em dólar, mas é propenso a ser visualmente confundido com aspas diretas, e as regras para quando você precisar de aspas dentro de um comando aspas são bastante complexas e dependentes da implementação, por isso é melhor não seguir $(…)( tem o mesmo efeito com uma sintaxe mais saudável).

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 apenas se o primeiro comando tiver êxito.

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

Uma alternativa ao uso &&após cada comando é iniciar seu script set -e. Isso indica ao shell para parar de executar o script assim que qualquer comando retornar um status diferente de zero (exceto para comandos em ifcondições e em alguns outros casos).

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

Seu findcomando é 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 mkdire, em seguida, atravessando-o imediatamente find. Isso não será útil a menos que o diretório já exista. Você queria criar um diretório para os logs de hoje e mover arquivos recentes de The_Logspara 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 do arquivo diferente para cada arquivo a ser movido.

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

Observe que eu usei -mtimepara mover arquivos com base no tempo de modificação, e não -atime, que é a hora em que o arquivo foi lido pela última vez (se o seu sistema acompanhar isso - se não o fizer, o atime pode estar no mesmo nível do arquivo). mtime).

Gilles 'SO- parar de ser mau'
fonte
3

Você pode renomear o arquivo com carimbo de data / hora anexado a ele

mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`
Atul Rokade
fonte
2

Este:

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

Deveria trabalhar. Embora, pareça que você esteja usando o csh, e minha solução para remover o sinal + pode não funcionar para você, mas não fará mal tentar. Colocar sua variável entre {} colchetes, sempre é uma boa idéia para evitar expansões inesperadas de variáveis.

MelBurslan
fonte
Obrigado companheiro, depois de adicionar sua correção com a outra resposta, está funcionando bem.
Eu sou L