Copiez un fichier et ajoutez un horodatage

13

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 Test2comme nom de fichier, mais je veux qu'il conserve le nom de fichier du 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 lorsque j'ajoute le %rcomme code d'horodatage, j'obtiens l'erreur indiquant que la cible "PM" n'est pas un répertoire. J'essaie d'obtenir l'horodatage en tant qu'horloge de 12 heures.

Brian
la source
L'ajout de AM / PM ajoute de l'espace supplémentaire dans le nom de fichier. Si vous insistez pour qu'il essaie quelque chose comme: cp -ra / home / bpacheco / Test1 "/ home / bpacheco / Test2 - $ (date +% m-% d-% y-% r)"
Romeo Ninov
2
Oudate +"%m-%d-%y-%I:%M:%S_%p"
don_crissti

Réponses:

12

L'un de vos problèmes est que vous avez omis les guillemets autour de la substitution de commande, de sorte que la sortie de la datecommande a été divisée en espaces. Voir Pourquoi mon script shell s'étouffe avec les espaces 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 de 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 l'expansion d'accolade à la place.

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

Si vous souhaitez copier le fichier dans un répertoire différent et ajouter l'horodatage au nom de fichier d'origine, vous pouvez le faire de cette façon - se ${source##*/} développe à la valeur de sourcesans la partie jusqu'au dernier /(il supprime le préfixe le plus long correspondant au modèle */):

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

Si Test1est un répertoire, il est copié récursivement, et les fichiers à l'intérieur du répertoire conservent leur nom: seul le répertoire toplevel reçoit un horodatage ajouté (par exemple Test1/fooest copié dans 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 d'horodatage est une mauvaise idée: il est difficile à lire pour les humains et difficile à trier. Vous devez utiliser un format plus facile à lire et qui peut être trié facilement, c'est-à-dire avec des parties par ordre décroissant d'importance: année, mois, jour, heure, minute, seconde, et avec une séparation entre la partie date et la partie heure.

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")"
Gilles 'SO- arrête d'être méchant'
la source
Gilles, la première commande ne fonctionnera pas à mon humble avis, vérifiez les positions des guillemets doubles. Et voir mon commentaire à la question
Roméo Ninov
@RomeoNinov Quel est le problème avec la première commande? L'avez-vous exécuté et obtenu une erreur?
Gilles 'SO- arrête d'être méchant'
Vous avez raison, la commande date est exécutée en sous
Romeo Ninov
Gilles, en utilisant votre exemple ci-dessus, comment copier le fichier avec les informations d'horodatage mentionnées ci-dessus dans un autre répertoire. La commande suivante ne fonctionne pas:cp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2
Brian
@Brian, je ne suis pas sûr d'avoir compris votre commentaire, mais voyez ma modification.
Gilles 'SO- arrête d'être méchant'