problème avec find -exec cp

Considérez cet exemple (alerte newbie):

touch test0 touch timestamp touch test1 sudo find /var/www/import -iname 'test*' -newer timestamp -exec cp {} new \; 

Il copy en fait le file test1, mais il renvoie le message:

 cp: `/var/www/import/new/test1' and `new/test1' are the same file 

Qu'est-ce que je fais mal?

2ème question, puis-je utiliser "+" avec cette command pour que les files soient copiés dans un seul "bundle"? Il y a des milliers de files!

Qu'est-ce que je fais mal?

C'est bon. find trouve déjà les files copiés dans new et tente de les copyr à nouveau, donc un message d'avertissement est affiché.

puis-je utiliser "+" avec cette command pour que les files soient copiés dans un seul "bundle"? Il y a des milliers de files!

Oui, mais vous devez modifier votre command de cette façon:

 find /var/www/import -iname 'test*' -newer timestamp -exec cp -t new {} + 

car {} doit être à la fin de l'instruction exec dans ce cas.

Ajoutez un echo avant le cp et vous verrez que c'est en train de faire

 cp new/test1 new cp test1 new 

C'est parce que la find ne regarde pas seulement dans le directory courant, elle regarde dans tous les sous-directorys.

Alternatives:

Dites de ne pas chercher dans les sous-directorys:

 find /var/www/import -maxdepth 1 \ -iname 'test*' -newer timestamp -exec cp {} new \; 

Dites find d'ignorer le new sous-directory:

 find /var/www/import -type d -name new -prune -o \ -iname 'test*' -newer timestamp -exec cp {} new \; 

Copiez les files dans un directory en dehors de /var/www/import :

 find /var/www/import \ -iname 'test*' -newer timestamp -exec cp {} /var/www/import.new \; 

Mais si vous avez des sous-directorys, vous perdrez tous les files portant le même nom.

par exemple si vous avez

 test0 test1 scripts/test1 

alors vous finirez avec

 test0 test1 new/test1 scripts/test1 

quel test1 été copié à new ?

Il y a quelques façons de gérer cela, mais la façon la plus simple et la plus efficace que je puisse imaginer est d'utiliser des cp --parents

 cd /var/www/import find . -type d -name new -prune -o \ -type f -iname 'test*' -newer timestamp -exec cp --parents {} new \; 

cela te donnera

 test0 test1 new/test1 new/scripts/test1 scripts/test1 

Rush a déjà répondu à la deuxième partie de votre question, alors je ne vais pas le répéter.