Problème avec find ... -exec cp ...

Résolu/Fermé
Melkor - 11 juin 2008 à 16:40
ZanKer92 Messages postés 1 Date d'inscription mercredi 20 octobre 2010 Statut Membre Dernière intervention 20 octobre 2010 - 20 oct. 2010 à 10:31
Bonjour,

j' ai passé ma journée à chercher des réponses à mon problème sur le net, mais une fois n'est pas coutume, je n'ai pas trouvé. je m'en remet donc à vous dans l'espoir de corriger mon problème.

J'ai besoin de faire un Cron de backup pour un serveur. Jusque la pas de souci. Mais parmi les données que je veux sauvegarder, il y a certains répertoires que je veux exclure.
Je pensais avoir trouvé la solution avec find en utilisant cp avec -exec, mais la copie me copie encore et toujours toute mon arborescence :/

Pourtant lorsque je crée une liste avec les mêmes critères de recherche que pour mon cp, la liste est impec et ne contient que les répertoires et fichiers que je veux.

find -P /home/www/ \( -iname 'A int*grer' -prune \) -o \( -iname 'BACKUP_B2C' -prune \) -o \( -iname 'poubelle' -prune \) -o \( -iname 'test*' -prune \) -o -fprint /home/baptiste/liste.txt;


Mais avec -exec cp c'est comme si je n'avais pas utilisé de find.

find -P /home/www/ \( -iname 'A int*grer' -prune \) -o \( -iname 'BACKUP_B2C' -prune \) -o \( -iname 'poubelle' -prune \) -o \( -iname 'test*' -prune \) -o -exec cp -rvf --parents {} /home/baptiste/ \;


J'avoue être un peu perdu là...
J'ai vu que ce forum déborde de bonnes âmes prêtes à aider, je m'en remet donc a vous !

Merci d'avance,

Melkor

17 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
12 juin 2008 à 12:32
A mon avis il faudrait créer une archive contenant la date du jour :

backup_quelquechose_$(date +%Y%m%d).tar.gz = backup_quelquechose_20080612.tar.gz

et supprimer après création celle faite 2 jours auparavant :
if [ -e backup_quelquechose_$(date -d '2 days ago' +%Y%m%d).tar.gz ]
then echo "rm -f backup_quelquechose_$(date -d '2 days ago' +%Y%m%d).tar.gz"
fi
rm -f backup_quelquechose_20080610.tar.gz
Ou un truc du genre...
1
ZanKer92 Messages postés 1 Date d'inscription mercredi 20 octobre 2010 Statut Membre Dernière intervention 20 octobre 2010 1
20 oct. 2010 à 10:31
Bonjour,

vous êtes sur CYGWIN, et vous voulez utiliser la commande "find" comme sur Unix/Linux. Mais vous obtenez l'erreur << missing argument to '-exec' >>.
Voici les commandes à faire, ou ne pas faire...

OK pour:
  find /path -name '*.log' -type f -mtime +365 -fprint
KO pour:
  find /path -name '*.log' -type f -mtime +365 -exec rm -f {} \;
OK pour:
  find /path -name '*.log' -type f -mtime +365 -exec rm -f {} ;
C'est la dé-spécialisation du point virgule (;) qu'il ne faut pas mettre à la fin de la commande find pour l'option -exec.
1
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
11 juin 2008 à 17:13
Salut,

C'est quoi cette option '-P' de find ? (pas trouvé dans le "man find" ;-( )

C'est pas l'option "--parents" de "cp" qui fiche le bazar par hasard ? T'as essayé sans ?
0
Salut jipicy,

pour le -P voila l'extrait de mon man

-P : Never follow symbolic links. This is the default behaviour. When find examines or prints information a file, and the file is a symbolic link, the information used shall be taken from the properties of the symbolic link itself.

Je ne pense pas que ce soit très utile dans mon cas mais bon.

Pour le --parents, j'ai essayé sans, et c'était un véritable bordel ^^. En fait ça m'avait copié des fichiers un peu partout, sans que je comprenne bien la logique. Le --parents me permet de garder l'arborescence telle qu'elle (je viens de re-tester à l'instant sans le --parents, et j'ai toujours mes répertoires non désirés qui se copient :/ ).

Je suis encore un bon n00b sur Linux, alors si il y a des trucs un peu bizarre ou inappropriés dans ce que j'écris il ne faut pas hésiter à me corriger.

Merci encore.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
11 juin 2008 à 17:39
Je viens de faire un test chez moi (avec l'option "-rv --parents" de la commande cp) et ça marche très bien ;-\

Essaye d'enlever l'option '-o' dans "-o -exec cp -rvf --parents {} /home/baptiste/ \;"
0
Oula je viens de tester, et ça m'a copié que les fichiers dont le nom contient 'test' :/

find -P /home/www/ \( -iname 'A int*grer' -prune \) -o \( -iname 'BACKUP_B2C' -prune \) -o \( -iname 'poubelle' -prune \) -o \( -iname 'test*' -prune \) -exec cp -rv --parents {} /home/baptiste/ \;


Étrange tout ça...
0
Rectification : ça ma copié tous les fichiers dont le nom contient 'test' ainsi que tous les fichiers dans les répertoires ayant 'test' dans leur nom.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
11 juin 2008 à 17:56
C'est peut être l'astérisque (*) qui gène alors, essaye sans le '-o \( -iname 'test*' -prune \)'
0
Même problème, sauf que cette fois ci c'est le répertoire 'poubelle' uniquement qui se copie !

Grrr ^^
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
11 juin 2008 à 18:04
Là j'en perds mon latin, enfin ça c'est pas dur j'en parle pas un mot ;-D

Pour récapituler, sans le "-exec cp..." la sortie est bonne ?
0
Bonjour,

Oui, pour récapituler, si je met un -fprint a la place de -exec cp, la liste obtenue est exactement ce que je souhaite backupé.

C'est pour ça que je suis un peu paumé moi aussi.
0
Tiens, il semblerais que ça puisse venir de mon -r du cp... Je vais faire d'autres tests.
0
Bon ben c'était bien ça, le -r qui faisait était superflu et faisait foirer mon filtre.

Par contre jipicy, si tu n'y vois pas d'inconvénients j'aurai encore deux trois questions pour que je puisse finir mon Cron.

Ma problématique est que le cron doit s'exécuter une fois par jour, mais j'aimerais garder au total deux backups ; les deux derniers en date.
Or je ne sais pas quelle facon est la plus simple pour tester et repérer quelle archive est la plus vieille afin de la supprimer. Surtout sachant que je ne sais pas comment travailler sur un nom de fichier (je n'ai pas encore trouver comment récupérer un nom de fichier, toujours avec un find, et le mettre dans une variable).

Merci d'avance pour ton aide et ton temps :)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
12 juin 2008 à 11:53
Content que tu aies pu trouver d'où venait l'erreur ;-))

Concernant le :
Surtout sachant que je ne sais pas comment travailler sur un nom de fichier (je n'ai pas encore trouver comment récupérer un nom de fichier, toujours avec un find, et le mettre dans une variable).
Un exemple de ce que tu veux exactement serait le bienvenu ;-))
0
Simple : en fait mon Cron va faire à minuit chaque jour un backup qui s'appellera par exemple backup_quelquechose.tar.gz.

Mon problème est de savoir comment arriver à garder simultanément que 2 archives (backup_1.tar.gz et backup_2.tar.gz par exemple).

Du coup il faut que mon cron arrive à repérer quel est l'archive la plus ancienne afin de la supprimer, et mette a la place la nouvelle, etc.

Le principe étant de garder le backup de la veille ainsi que celui de la journée courante (on ne sait jamais ce qui peux arriver, autant être prudent !)

J'espère avoir été plus clair ^^.

Merci à toi, et bon appétit !
0
Bon j'ai peut être été un peu vite, je viens de voir que je n'ai pas vraiment répondu à ta question.

Je te parlais de travailler sur le nom d'un ficher car je pensais utiliser un find pour trouver mes backups parmi d'autre fichiers, et utiliser soit la date de création de l'archive, soit un numéro passé dans son nom afin de savoir laquelle est la plus ancienne afin de la supprimer. Or je n'arrive pas a passer le résultat de mon find dans une variable afin de pouvoir effectuer des traitements dessus.

Voili voilou.
0
Merci bien, par contre je ne connais pas la signification du -e dans le if.
0
OK pas de problème je viens de trouver la signification du -e, c'est file exists.

Bon bah tout ça commence a prendre forme, merci encore pour ton soutient jipicy ^^
0