Comment mettre la date et l'heure dans un nom de fichier?

23

J'essaie d'exécuter une commande et je voudrais mettre la date et l'heure dans le nom du fichier de sortie.

Voici un exemple de commande que j'aimerais exécuter.

md5sum /etc/mtab > 2016_4_25_10_30_AM.log

Le format de la date et de l'heure peut être tout à fait sensé avec des traits de soulignement. Même UTC si l'AM et le PM ne peuvent pas être utilisés.

visc
la source
Si ce n'est pas Bash, alors quel shell utilisez-vous?
Ryan
Oh c'est bash ... je voulais dire script bash *
visc
Vous ne jouez pas, vous redirigez. Et la question serait la même si vous ne redirigiez pas. Mise à jour du titre.
Mikel

Réponses:

46

Si vous souhaitez utiliser le datetime actuel comme nom de fichier, vous pouvez utiliser dateet remplacer la commande .

 $ md5sum /etc/mtab > "$(date +"%Y_%m_%d_%I_%M_%p").log"

Il en résulte que le fichier 2016_04_25_10_30_AM.log(bien que, avec l'heure actuelle) soit créé avec le hachage md5 /etc/mtabcomme contenu.

Veuillez noter que les noms de fichiers contenant des horodatages au format 12 heures ne seront probablement pas triés par nom comme vous le souhaitez. Vous pouvez éviter ce problème en utilisant des horodatages au format 24 heures à la place.

Si vous n'êtes pas obligé d'utiliser ce format de date spécifique, vous pouvez envisager d'utiliser un format datetime conforme à ISO 8601. Voici quelques exemples de génération de représentations datetime ISO 8601 valides:

 $ date +"%FT%T"
 2016-04-25T10:30:00

 $ date +"%FT%H%M%S"
 2016-04-25T103000

 $ date +"%FT%H%M"
 2016-04-25T1030

 $ date +"%Y%m%dT%H%M"
 20160425T1030

Si vous voulez des noms de fichiers "plus sûrs" (par exemple, pour des raisons de compatibilité avec Windows), vous pouvez omettre les deux-points de la partie temporelle.

Veuillez garder à l'esprit que les exemples ci-dessus supposent tous l'heure locale du système. Si vous avez besoin d'une représentation horaire cohérente d'un fuseau horaire à l'autre, vous devez spécifier un décalage de fuseau horaire ou UTC. Vous pouvez obtenir un décalage de fuseau horaire conforme à la norme ISO 8601 en utilisant "% z" dans la partie format de votre dateappel comme ceci:

 $ date +"%FT%H%M%z"
 2016-04-25T1030-0400

Vous pouvez obtenir l'heure UTC dans votre dateappel en spécifiant l' -uindicateur et en ajoutant "Z" à la fin de la chaîne datetime pour indiquer que l'heure est UTC comme ceci:

 $ date -u +"%FT%H%MZ"
 2016-04-25T1430Z
Ryan
la source
@Mikel Vous et moi avons effectué un cross-edit?
Ryan
Peut-être. Je viens de changer "sous-shell" en "substitution de commande". J'ai terminé maintenant, alors veuillez modifier comme vous le souhaitez.
Mikel
@Mikel Pas de problème. J'ai de nouveau soumis ma modification maintenant.
Ryan
@Mikel Pas de soucis! J'aurais dû penser à l'appeler "substitution de commande" de toute façon. Merci d'avoir amélioré la réponse!
Ryan
3
Underscore est un personnage étrange. Il est préférable d'utiliser ISO-8601 comme celui $(date +%FT%T)qui donnera 2016-04-25T10:30:00.
hschou