web-dev-qa-db-fra.com

Copier un fichier et ajouter un horodatage

J'ai deux problèmes avec mon script qui copie des fichiers et ajoute un horodatage au nom.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%T")

Ce qui précède ajoute Test2 Comme le nom de fichier, mais je veux qu'il conserve le nom du fichier de fichier source d'origine qui, dans cet exemple, est nommé Test.

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%r")

L'autre problème est quand j'ajoute le %r Comme le code horodatage, je reçois l'erreur indiquant que "PM" cible n'est pas un répertoire. J'essaie d'obtenir l'horodatage comme heure d'horloge de 12 heures.

13
Brian

L'un de vos problèmes est que vous avez laissé de côté les citations doubles autour de la substitution de commande, la sortie de la commande date était divisée dans des espaces. Voir Pourquoi mon script shell s'étend sur WhitSpace ou d'autres caractères spéciaux? Ceci est une commande valide:

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%m-%d-%y-%r")"

Si vous souhaitez ajouter au nom du fichier d'origine, vous devez l'avoir dans une variable.

source=/home/bpacheco/Test1
cp -a -- "$source" "$source-$(date +"%m-%d-%y-%r")"

Si vous utilisez Bash, vous pouvez utiliser une expansion de Brace.

cp -a /home/bpacheco/Test1{,"-$(date +"%m-%d-%y-%r")"}

Si vous souhaitez copier le fichier dans un autre répertoire et ajouter l'horodatage au nom du fichier d'origine, vous pouvez le faire de cette manière - ${source##*/}expandes à la valeur de source sans la partie jusqu'au dernier / (il supprime le préfixe le plus long correspondant au motif */):

source=/home/bpacheco/Test1
cp -a -- "$source" "/destination/directory/${source##*/}-$(date +"%m-%d-%y-%r")"

Si Test1 est un répertoire, il est copié de manière récursive, et les fichiers à l'intérieur du répertoire conservent leur nom: seul le répertoire Toplevel obtient un horodatage ajouté (par exemple, Test1/foo est copié sur Test1-05-10-15-07:19:42 PM). Si vous souhaitez ajouter un horodatage à tous les noms de fichiers, c'est un problème différent.

Votre choix de format horodatage est une mauvaise idée: il est difficile de lire pour l'homme et difficile à trier. Vous devez utiliser un format plus facile à lire et qui peut être trié facilement, c'est-à-dire avec des parties en décroissant l'ordre d'importance: année, mois, jour, heure, minute, seconde et avec une séparation entre la partie Date et la partie temporelle.

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y%m%d-%H%M%S")"
cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y-%m-%dT%H%M%S%:z")"