Comment ajouter la date au fichier de sauvegarde


70

J'ai besoin de faire une sauvegarde d'un fichier et j'aimerais avoir un horodatage dans le nom pour faciliter la différenciation.

Comment injecteriez-vous la date du jour dans une commande de copie?

[root@mongo-test3 ~]# cp foo.txt {,.backup.`date`}
cp: target `2013}' is not a directory

[root@mongo-test3 ~]# cp foo.txt {,.backup. $((date)) }
cp: target `}' is not a directory  

[root@mongo-test3 ~]# cp foo.txt foo.backup.`date`
cp: target `2013' is not a directory

Réponses:


109

Cela ne fonctionne pas car la commande dateretourne une chaîne contenant des espaces.

$ date
Wed Oct 16 19:20:51 EDT 2013

Si vous voulez vraiment de tels noms de fichiers, vous devrez envelopper la chaîne entre guillemets.

$ touch "foo.backup.$(date)"

$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:22 foo.backup.Wed Oct 16 19:22:29 EDT 2013

Je pense cependant que vous pensez probablement à ajouter une chaîne différente à ajouter. J'utilise habituellement quelque chose comme ça:

$ touch "foo.backup.$(date +%F_%R)"
$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:25 foo.backup.2013-10-16_19:25

Voir la page de manuel pour la date pour plus de codes de formatage autour de la sortie pour la date et l'heure.

Formats supplémentaires

Si vous souhaitez prendre le contrôle total en consultant la page de manuel, procédez comme suit:

$ date +"%Y%m%d"
20131016

$ date +"%Y-%m-%d"
2013-10-16

$ date +"%Y%m%d_%H%M%S"
20131016_193655

REMARQUE: Vous pouvez utiliser date -Iou date --iso-8601qui produira une sortie identique à date +"%Y-%m-%d. Ce commutateur a également la capacité de prendre un argument pour indiquer différents formats d’heure :

$ date -I=?
date: invalid argument ‘=?’ for ‘--iso-8601
Valid arguments are:
  - hours
  - minutes
  - date
  - seconds
  - ns
Try 'date --help' for more information.

Exemples:

$ date -Ihours
2019-10-25T01+0000

$ date -Iminutes
2019-10-25T01:21+0000

$ date -Iseconds
2019-10-25T01:21:33+0000

1
+1 - J'utilise toujours un spécificateur de format pour la date, soit "% Y% m% d-% H% M% S" ou "% y% m% d-% H% M% S".
ChuckCottrill

Cela touch foo`date +%F`fonctionne aussi très bien.
Vadzim

mise en garde: cela ne fonctionne pas en cshshell
Govinda Sakhare

1
@GovindaSakhare - csh / tcsh bascule la notation de sous-shell sur backticks ( ...) au lieu de $(..). Les shells C ne supportent apparemment pas cette notation pour les sous-shells.
slm

date +"%Y-%m-%d"est le même que date -I. Je recommanderai les formats iso de toute façon. La précision peut être spécifiée en ajoutant des heures, des minutes, des secondes ou des ns au paramètre -I. Exemple date -Iseconds.
Till Schäfer

13
cp foo.txt {,.backup.`date`}

Cela s'étend à quelque chose comme cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013. L'espace avant les accolades commence un nouveau mot.

cp foo.txt {,.backup. $((date)) }

Les accolades sont en mots séparés, ils sont donc interprétés littéralement. En outre, $((…))est la syntaxe pour le développement arithmétique; le résultat de datene ressemble en rien à une expression arithmétique. La substitution de commande utilise un seul ensemble de parenthèses: $(date).

cp foo.txt foo.backup.`date`

Plus proche. Vous auriez pu exprimer cela avec des accolades comme cp foo.{txt,.backup.`date`}. Il y a toujours le problème que la sortie de datecontient des espaces, il faut donc la mettre entre guillemets. Cela fonctionnerait:

cp foo.{txt,backup."`date`"}

ou

cp foo.{txt,backup."$(date)"}

Le format de sortie par défaut de daten'est pas bien adapté à un nom de fichier et peut même ne pas fonctionner si un environnement local utilise des /caractères dans le format de sortie par défaut. Utilisez un format de date YMD pour que l'ordre lexicographique des noms de fichiers soit l'ordre chronologique (et pour éviter toute ambiguïté entre les formats de date américain et international).

cp foo.{txt,backup."$(date +%Y%m%d-%H%M%S)"}

le dernier m'a donné cp: la cible `foo..backup.20160913-134158 'n'est pas un répertoire
Kalpesh Soni le

@KalpeshSoni La commande exacte que j'ai postée ne peut pas produire ce message d'erreur. Vous devez avoir utilisé une commande différente.
Gilles 'SO- arrête d'être méchant' le

10

Si vous voulez vraiment utiliser la date prolixe, vous devez protéger le backtick. Le format avec cette date est qu’il contient des espaces, un no-no dans un shell Unix, sauf si vous les mettez entre guillemets (ou que vous leur échappez d’une autre manière).

cp foo.txt "foo-`date`.txt"

Cependant, je préfère utiliser le format ISO le plus court:

cp foo.txt foo-`date --iso`.txt

5

Utilisez une fonction, cela vous facilitera la vie. C'est ce que j'utilise:

backup () { 
    for file in "$@"; do
        local new=${file}.$(date '+%Y%m%d')
        while [[ -f $new ]]; do
            new+="~";
        done;
        printf "copying '%s' to '%s'\n" "$file" "$new";
        \cp -ip "$file" "$new";
    done
}

4

Comme datepar défaut les espaces blancs dans sa sortie, votre dernière commande a échoué. Si vous aviez cité le dernier argument avec ", cela devrait marcher. Vos autres essais ont juste une mauvaise syntaxe

Voici une solution possible sans espaces:

cp foo.txt foo.backup.$(date --iso-8601=seconds)  

ou

cp foo.txt foo.backup.`date --iso-8601=seconds`

Si vous ajoutez

bk() {
     cp -a "$1" "${1}_$(date --iso-8601=seconds)"
}

Pour vous .bashrcconnecter à nouveau et laisser votre bash le relire, il vous suffit d'appeler bk file.txt.


Mon manuel de date RHEL ne montre pas le --iso-8601commutateur, alors je mets le lien ici. Options de date GNU: --iso-8601
Ivan Chau

3

Vous copiez un fichier dans un fichier de sauvegarde dont le nom est créé avec l'horodatage ajouté

cp foo.txt backup_`date +"%d-%m-%Y"`.txt

OU:

Vous pouvez afficher le contenu du fichier en utilisant "cat" et rediriger la sortie vers un fichier de sauvegarde dont le nom est créé avec l'horodatage ajouté

cat foo.txt > backup_`date +"%d-%m-%Y"`.txt

Vous pouvez également utiliser plus d'options de contrôles de FORMAT selon vos besoins, par exemple:% H,% M,% S, etc.


Quel est l'avantage de la catredirection par-dessus cp?
Guido

C'est une autre façon de le faire
Atul Rokade

2

Lorsque je dois sauvegarder un fichier, je le fais généralement de cette façon.

cp foo.txt foo.backup.$(date +%F).txt

ls -l

foo.txt foo.backup.2017-9-19.txt


1
Cela n’ajoute rien que d’autres réponses n’aient pas déjà évoqué. De plus, le %Fformat de date produit des mois à 2 chiffres et ls -ldonne généralement un peu plus d'informations que les noms de fichiers.
Kusalananda

1

En bash, vous pouvez taper:

cp /path/to/long/filename !#$_$(date +Is)

Qui s'étend à:

cp /path/to/long/filename /path/to/long/filename_$(date +Is)

Résultant en:

$ ls /path/to/long/filename*
filename  filename_2017-05-10T11:50:10+0300

Le boeuf étant date -Is. J'aime l'utiliser car il est facile à retenir, à taper et permet des versions courtes (comme -Insi vous êtes un maniaque de la précision).


! commence un désignateur d'événement:

 !#     The entire command line typed so far.

Et $est un désignateur de mot:

   $      The last word.  This is usually the last argument, but will expand to the zeroth word if there is only one word in the line.

0

Si vous souhaitez simplement une sauvegarde du fichier ou du répertoire, alors pourquoi saisir la destination également, utilisez simplement l'extension du shell pour ajouter la date à la fin du nom de fichier de la copie.

c'est à dire

cp filename.sh{,."`date`"}

qui se traduit par

filename.sh.Sun 29 Sep 00:44:43 BST 2019

ou simplement utiliser

cp filename{,.20190929}

filename.sh.20190929

Ajoutez la date pour répondre à vos besoins. :)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.