Comment tester quels fichiers seront copiés avec la commande cp?

11

Je crée un script simple qui copie tous les fichiers de DIRECTORYA qui n'existent pas dans DIRECTORYB. Je fais cela en utilisant la commande cp:

cp -u DIRECTORYA/* DIRECTORYB

J'aimerais également envoyer un e-mail à un administrateur qui répertoriera les fichiers qui ont été copiés.

Donc, idéalement, avant d'exécuter la commande ci-dessus, j'aimerais obtenir les fichiers qui seront copiés et les stocker dans une variable pour une utilisation ultérieure lors de la création de mon message électronique.

Quelqu'un peut-il m'orienter dans la bonne direction? J'ai étudié l'utilisation de grep mais je ne pense pas que cela puisse être fait avec la commande cp?

James
la source
1
Peut-être que je comprends mal votre question, mais ne pouvez-vous pas utiliser le -vdrapeau pour imprimer les noms de fichiers lors de leur copie? Redirigez cela vers un fichier ou directement dans une variable et utilisez-le pour créer votre message.
ThibautRenaux
De plus, la cpcommande a une option --attributes-onlyqui permet de ne pas copier les données des fichiers, mais simplement la structure des répertoires et des fichiers.
Costas
Désolé, je suis assez nouveau dans les scripts. Si j'utilise l'indicateur -v, comment puis-je générer une variable au lieu d'un fichier?
James
1
En supposant que vous utilisez bash, variable=$(cp -v ...)capture la sortie standard de cp. Voir gnu.org/software/bash/manual/html_node/Command-Substitution.htm
Gowtham

Réponses:

4

Je ne pense pas que GNU cpait quoi que ce soit pour vous aider si vous voulez voir ce qu'il ferait sans agir. Si vous souhaitez enregistrer les fichiers qui ont été modifiés, vous pouvez utiliser l' -voption:

cp -puv DIRECTORYA/* DIRECTORYB >copy.log

Au lieu de cp, vous pouvez utiliser rsync , qui est beaucoup plus puissant et installé presque partout sauf pour les systèmes embarqués bas de gamme (et facile à installer là où il n'est pas présent par défaut).

rsync -aun DIRECTORYA/* DIRECTORYB >what-would-be-done.txt

ou

rsync -auv DIRECTORYA/* DIRECTORYB >copy.log
Gilles 'SO- arrête d'être méchant'
la source
2

Si vous vouliez courir cp foo*bar whatever, courez à la echo foo*bar whateverplace

VaTo
la source
Mais OP veut s'exécuter cp -uet il cherche une option semblable à un essai à sec pour cp.
Arkadiusz Drabczyk
2

Selon la page de manuel ,

-u, copiez uniquement lorsque le fichier SOURCE est plus récent que le fichier de destination ou lorsque le fichier de destination est manquant--update

c'est une fonctionnalité qui combine deux tests, un trivial à implémenter dans un script ( manquant ) et un nécessitant un peu de travail ( plus récent ). Vous pouvez créer un script qui indique ce qui est nécessaire à l'aide de comm, diffet test.

Aucun des cputilitaires standard ne permet d'exécuter à sec une opération de copie. Comme suggéré, rsyncc'est la façon de le faire avec un utilitaire communément disponible. Bien sûr, rsyncest généralement utilisé pour copier sur la base de plus de critères que simplement les plus récents ou manquants (la taille du fichier et les horodatages sont également utilisés). Mais cela peut être réduit à faire juste cp -u.

Pour les utilitaires non standard, il y a l' copyutilitaire que j'ai écrit (et bien sûr encore utilisé) à la fin des années 1980. Il a probablement été inspiré par l' makeutilitaire, car la première option que j'ai ajoutée était -n.

Pour l'exemple donné, il serait utilisé comme ceci:

$ copy -nvU DIRECTORYA/* DIRECTORYB
** copy DIRECTORYA/foo to DIRECTORYB/foo
** 1 file would be copied, 616 bytes

Lectures complémentaires:

  • copy - utilitaire de copie de fichiers / répertoires

    -n désactive la création ou la modification effective des fichiers et (selon le niveau de verbosité) montre l'effet que la copy commande aurait.
    -u copie les fichiers uniquement si leur taille ou leur date de modification diffère, et les liens uniquement si le texte du lien diffère.
    -U copie uniquement les fichiers plus récents que la destination ou qui n'existent pas dans la destination.

  • entrée du journal des modifications d' août 1988 :

    1988-08-16    
            * src / copy / src / copy.c: ajout des options "-d" et "-n".
    
Thomas Dickey
la source
0

Vous pouvez utiliser la commande diff. J'ai un travail qui copie tous les jours des fichiers de sauvegarde. quelque temps j'ai besoin de vérifier si tous les fichiers sont copiés, voici la syntaxe:

diff /file1/ /file2/

et bien sûr si vous voulez les copier utilisez:

cp -u /file1/* /file2
pauvres
la source
0

Envisagez plutôt d'utiliser rsync. Rsync fonctionne parfaitement bien sur les copies locales et peut certainement faire ce que vous voulez, une fois que vous aurez parcouru les quinze options de gazillion dont il dispose.

rsync -avun DIRECTORYA/ DIRECTORYB

vous montrera tout ce qui serait fait, et

rsync -avu DIRECTORYA/ DIRECTORYB

le fera.

Edward Falk
la source