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

55

J'essaie d'ajouter la date du jour à la fin d'un nom de fichier comme ceci:

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 je reçois est le nom du fichier, qui n’ajoute rien. Comment puis-je ajouter une date actuelle à un nom de fichier?

JE SUIS L
la source
Lorsque vous entrez date, assurez-vous de ne pas utiliser, :car il sera alors lu en tant qu'hôte dans rsync et scp. stackoverflow.com/a/37143274/390066
kirill_igum

Réponses:

78

Plus que probablement, c'est votre utilisation de set. Cela assignera 'aujourd'hui', '=' et la sortie du dateprogramme à des paramètres de position (arguments de ligne de commande). Vous voulez simplement utiliser le shell C (que vous étiquetez 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 voulez 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 s'appuie sur l'autre. La findcommande peut échouer car elle est lancée avant le mkdir.

Arcege
la source
Merci pour ce camarade, ça marche à 100% maintenant, bravo pour le heads-up et mkdir
I AM L
55

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;

Lorsqu'il est exécuté, 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 de date en passant les indicateurs Y, m, d, H, M et S pour configurer la sortie. Placez le résultat dans la variable de date.

Créez une nouvelle variable appelée nom de fichier, entourez la variable $ today avec le reste du texte statique du nom de fichier. puis renvoie le 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"
Eric Leschinski
la source
5

Vous semblez avoir mélangé plusieurs choses.

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

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

(J'ai également complété la spécification de date). Vous pouvez utiliser backquotes au lieu de dollar-parenthèses, mais il est susceptible d'être visuellement confondu avec des guillemets avant et les règles quand vous avez besoin des citations dans une commande backquoted sont assez complexes et dépendant de la mise en œuvre, il est donc préférable de ne pas 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 tâche de fond, ce qui n’est pas voulu ici. Je suppose que vous vouliez dire &&, ce qui signifie d'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 &&après chaque commande consiste à 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 statut différent de zéro (à l'exception des commandes dans les ifconditions et de quelques autres cas).

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

Votre findcommande 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 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 des fichiers récents d' The_Logsun répertoire appelé par exemple The_Logs.2012-02-11?

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

Ou aviez-vous l'intention de 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’avais l'habitude -mtimede déplacer les fichiers en fonction de leur heure de modification, et non de -atimel'heure à laquelle le fichier a été lu pour la dernière fois (si votre système en tient compte, sinon, l'heure peut être aussi ancienne que le mtime).

Gilles, arrête de faire le mal
la source
3

Vous pouvez renommer le fichier avec l'horodatage ajouté

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

Cette:

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

devrait marcher. Bien que vous ayez l'impression d'utiliser csh, ma solution consistant à supprimer le signe + risque de ne pas fonctionner pour vous, mais rien ne vous gênera. Le fait de placer votre variable entre {} accolades est toujours une bonne idée pour éviter toute expansion inattendue de la variable.

MelBurslan
la source
Merci copain, après avoir ajouté votre correction à l’autre réponse, cela fonctionne bien.
JE SUIS L