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?
:
car il sera alors lu en tant qu'hôte dans rsync et scp. stackoverflow.com/a/37143274/390066Réponses:
Plus que probablement, c'est votre utilisation de
set
. Cela assignera 'aujourd'hui', '=' et la sortie dudate
programme à 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: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. Lafind
commande peut échouer car elle est lancée avant lemkdir
.la source
Script Bash pour injecter une date dans un nom de fichier:
Ce code bash dans un fichier appelé
a.sh
Lorsqu'il est exécuté, imprime:
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:
la source
Vous semblez avoir mélangé plusieurs choses.
set today = 'date +%Y'
ressemble à la syntaxe tcsh, mais même dans tcsh, il attribue la chaînedate +%Y
à la variabletoday
, il n'exécute pas ladate
commande. Comme vous utilisez probablement bash ou un autre shell POSIX, la syntaxe d'une affectation est la suivantetoday=some_value
(sans espaces autour du signe égal). Pour exécuter la commande et affecter sa sortie à la variable, utilisez la substitution de commande :(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.Une alternative à l'utilisation
&&
après chaque commande consiste à démarrer votre script avecset -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 lesif
conditions et de quelques autres cas).Votre
find
commande 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édiatementfind
. 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_Logs
un répertoire appelé par exempleThe_Logs.2012-02-11
?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.Notez que j’avais l'habitude
-mtime
de déplacer les fichiers en fonction de leur heure de modification, et non de-atime
l'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).la source
Vous pouvez renommer le fichier avec l'horodatage ajouté
la source
Cette:
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.
la source