web-dev-qa-db-fra.com

Ajout d'une date actuelle d'une variable à un nom de fichier

J'essaie d'ajouter la date actuelle à la fin d'un nom de fichier comme celui-ci:

TheFile.log.2012-02-11

Voici ce que j'ai jusqu'à présent:

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

Cependant, tout ce que j'obtiens, c'est le nom du fichier, et il n'ajoute rien. Comment ajouter une date actuelle à un nom de fichier?

60
I AM L

Il est plus que probable que vous utilisez set. Cela affectera "aujourd'hui", "=" et la sortie du programme date aux paramètres de position (également appelés arguments de ligne de commande). Vous voulez simplement utiliser C Shell (que vous marquez ceci comme "bash", donc probablement pas), vous voudrez utiliser:

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

Notez le manque d'espaces autour du signe égal.

Vous ne souhaitez pas non plus utiliser & à la fin de vos déclarations; ce qui empêche le shell d'attendre la fin de la commande. Surtout quand on se fie au suivant. La commande find peut échouer car elle est démarrée avant le mkdir.

85
Arcege

Script Bash pour injecter une date dans un nom de fichier:

Ce code bash dans un fichier appelé a.sh

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

Lors de l'exécution, imprime:

eric@dev ~ $ chmod +x a.sh

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

Explication du code:

Interprétez le script avec l'interpréteur/bin/bash. Créez une nouvelle variable appelée aujourd'hui. Exécutez la commande date, en passant les indicateurs Y, m, d, H, M, S pour configurer la sortie. Placez le résultat dans la variable date.

Créez une nouvelle variable appelée nom de fichier, entourez la variable $ today avec le reste du texte de nom de fichier statique. puis faites écho au nom du fichier à l'écran.

Cram dans un one-liner pour augmenter lulz:

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

Vous semblez avoir mélangé plusieurs choses.

set today = 'date +%Y' Ressemble à la syntaxe tcsh, mais même dans tcsh il affecte la chaîne date +%Y À la variable today, il n'exécute pas la commande date. Comme vous utilisez probablement bash ou un autre shell POSIX, la syntaxe d'une affectation est today=some_value (Sans espace autour du signe égal). Pour exécuter la commande et affecter sa sortie à la variable, utilisez substitution de commande :

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

(J'ai également complété la spécification de date). Vous pouvez utiliser des guillemets au lieu de parenthèses dollar, mais il est susceptible d'être confondu visuellement avec des guillemets à terme, et les règles pour quand vous avez besoin de guillemets dans une commande à guillemets arrière sont assez complexes et dépendent de l'implémentation, il est donc préférable de ne pas s'en tenir à $(…) (qui a le même effet avec une syntaxe plus saine).

Vous avez utilisé & À la fin de plusieurs commandes. Cela fait exécuter la commande en arrière-plan, ce qui n'est pas souhaité ici. Je suppose que vous vouliez dire &&, Ce qui signifie exécuter la commande suivante uniquement si la première commande a réussi.

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

Une alternative à l'utilisation de && Après chaque commande est de démarrer votre script avec set -e. Cela indique au shell d'arrêter l'exécution du script dès qu'une commande renvoie un état différent de zéro (à l'exception des commandes dans des conditions if et quelques autres cas).

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

Votre commande find est correcte mais ne fait probablement pas ce que vous avez l'intention de faire (bien que je ne sache pas exactement ce que c'est).

Vous créez un répertoire avec mkdir, puis vous le parcourez immédiatement avec find. Cela ne sera utile que si le répertoire existe déjà. Vouliez-vous créer un répertoire pour les journaux d'aujourd'hui et déplacer les fichiers récents de The_Logs Vers un répertoire appelé par ex. The_Logs.2012-02-11?

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

Ou vouliez-vous renommer les fichiers journaux d'aujourd'hui pour ajouter le suffixe $today? Cela nécessite de calculer le nom de fichier différent pour chaque fichier à déplacer.

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

Notez que j'ai utilisé -mtime, Pour déplacer des fichiers en fonction de leur heure de modification, et non -atime, Qui est l'heure de la dernière lecture du fichier (si votre système garde une trace de cela - si ce n'est pas le cas) 't, le atime peut être aussi loin que le mtime).

Vous pouvez renommer un fichier avec un horodatage ajouté

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

Cette:

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

devrait marcher. Cependant, il semble que vous utilisiez csh et ma solution de suppression du signe + peut ne pas fonctionner pour vous, mais cela ne fera pas de mal d'essayer. Mettre votre variable entre crochets {} est toujours une bonne idée pour éviter les extensions de variable inattendues.

2
MelBurslan