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
spuder
la source

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
slm
la source
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)"}
Gilles, arrête de faire le mal
la source
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
Railgun2
la source
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
}
Glenn Jackman
la source
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.

jofel
la source
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.

Atul Rokade
la source
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

fernando garza
la source
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.
utilisateur1338062
la source
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. :)

Steve Rowe
la source