Aggiunta di una data corrente da una variabile a un nome file


55

Sto cercando di aggiungere la data corrente alla fine di un nome file come questo:

TheFile.log.2012-02-11

Ecco quello che ho finora:

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

Comunque tutto quello che ottengo è il nome del file e non aggiunge nulla. Come posso aggiungere una data corrente a un nome file?


quando apppand date, assicuratevi di non usare :perché allora verrà letto come host in rsync e scp. stackoverflow.com/a/37143274/390066
kirill_igum

Risposte:


78

Molto probabilmente è il tuo utilizzo set. Ciò assegnerà "oggi", "=" e l'output del dateprogramma ai parametri posizionali (ovvero argomenti della riga di comando). Vuoi usare solo la shell C (che stai etichettando come "bash", quindi probabilmente no), vorrai usare:

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

Notare la mancanza di spazi attorno al segno uguale.

Inoltre, non si desidera utilizzare &alla fine delle dichiarazioni; che fa sì che la shell non attenda il termine del comando. Soprattutto quando uno si affida al successivo. Il findcomando potrebbe non riuscire perché è stato avviato prima di mkdir.


Grazie per quel compagno, ora funziona al 100%, Saluti per l'heads-up e e mkdir
I AM L

55

Bash script per inserire una data in un nome file:

Questo codice bash nel file chiamato a.sh

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

Quando eseguito, stampa:

eric@dev ~ $ chmod +x a.sh

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

Spiegazione del codice:

Interpreta lo script con l'interprete / bin / bash. Crea una nuova variabile chiamata oggi. Eseguire il comando data, passando i flag Y, m, d, H, M, S per configurare l'output. Posiziona il risultato nella variabile della data.

Crea una nuova variabile chiamata nome file, racchiudi la variabile $ today con il resto del testo statico del nome file. quindi echo il nome del file sullo schermo.

Riempilo in una fodera per aumentare lulz:

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

5

Sembra che tu abbia confuso diverse cose.

set today = 'date +%Y'assomiglia alla sintassi di tcsh, ma anche in tcsh assegna la stringa date +%Yalla variabile today, non esegue il datecomando. Dato che probabilmente stai usando bash o qualche altra shell POSIX, la sintassi di un compito è today=some_value(senza spazi attorno al segno uguale). Per eseguire il comando e assegnare il suo output alla variabile, utilizzare la sostituzione del comando :

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

(Ho anche completato la specifica della data). Puoi usare i backquotes invece delle parentesi in dollari, ma è incline a essere visivamente confuso con le virgolette, e le regole per quando hai bisogno di virgolette all'interno di un comando backquoted sono piuttosto complesse e dipendenti dall'implementazione, quindi è meglio non attenersi a $(…)(che ha lo stesso effetto con una sintassi più sana).

Hai usato &alla fine di diversi comandi. Ciò rende il comando eseguito in background, che non è desiderato qui. Sospetto che intendessi &&, il che significa eseguire il comando successivo solo se il primo comando ha avuto successo.

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

Un'alternativa all'utilizzo &&dopo ogni comando è di avviare lo script con set -e. Questo dice alla shell di interrompere l'esecuzione dello script non appena un comando restituisce uno stato diverso da zero (ad eccezione dei comandi nelle ifcondizioni e in alcuni altri casi).

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

Il tuo findcomando va bene, ma probabilmente non fa quello che intendi fare (anche se non so per certo di cosa si tratti).

Stai creando una directory con mkdire poi la attraversi immediatamente con find. Ciò non sarà utile se la directory non esiste già. Intendevi creare una directory per i registri di oggi e spostare i file recenti da The_Logsuna directory chiamata ad esempio The_Logs.2012-02-11?

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

O intendevi rinominare i file di registro di oggi per aggiungere il suffisso $today? Ciò richiede il calcolo del nome file diverso per ogni file da spostare.

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

Nota che ho usato -mtime, per spostare i file in base al loro tempo di modifica, e non -atime, che è l'ora dell'ultima lettura del file (se il tuo sistema ne tiene traccia - in caso contrario, l'atime potrebbe risalire al mtime).


3

È possibile rinominare il file con il timestamp allegato

mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`

2

Questo:

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

dovrebbe funzionare. Anche se sembra che tu stia usando csh e la mia soluzione per rimuovere il segno + potrebbe non funzionare per te ma non ti farà male provare. Racchiudere la variabile tra parentesi graffe {} è sempre una buona idea per evitare espansioni impreviste delle variabili.


Grazie amico, dopo aver aggiunto la correzione con l'altra risposta, funziona benissimo.
I AM L
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.