masse mv en utilisant find?

il y a un tas de filename.gif dispersés dans / home / directories. Je souhaite que tous les filename.gif soient remplacés par un /home/shared/filename_default.gif.

J'ai essayé quelque chose comme

find /home/ -name "filename.gif" | xargs <cmd> 

mais je n'ai aucune idée de faire reference à ce que je veux. Je ne suis pas sûr de le requestr ici ou du stackoverflow

Edit: Cela fonctionne exactement comme je l'ai expliqué, sauf que je voulais non seulement datatables de filename_default pour replace filename.gif, mais aussi pour que filename.gif soit renommé filename_default.gif. Donc, j'ai mv {} filename_default.gif et mv'ed tous les files de leurs directorys vers / root / sous le nom filename_default.gif … lol. est-il de toute façon de reference de la variable changeante dans un directory …

par exemple find / home / -name "filename.gif" était en réalité situé comme ça …

 /home/brian/dir/1/2/3/filename.gif /home/beth/dir/1/2/3/filename.gif /home/andrea/dir/1/2/3/filename.gif 

Comment puis-je faire reference à brian, beth, andrea … comme un caractère générique *.

 cp /home/shared/filename_default.gif /home/*/dir/1/2/3/filename_default.gif 

Que dis-tu de ça?

find /home/ -name filename.gif -exec mv -f /home/shared/filename_default.gif {} \;

Le drapeau -exec trouve une command sur chaque object trouvé. Le {} indique le nom du file trouvé. Vous devez ensuite terminer la command shell avec \; . Vous pourriez sans doute utiliser ln -s pour lier ces .gifs. Cela pourrait être plus facile si vous voulez changer votre partage .gif sans refaire ce genre de search et de déplacement.

Éditer de bons points par Denilson ci-dessous. Malgré la question impliquant mv , cela ne fonctionnera qu'une fois, avant que le file source n'ait disparu. (déplacé) Son conseil sur la command écho est un bon moyen de vérifier ce qui se passera avant qu'il ne le soit.

find /home/ -name filename.gif -exec cp -p /home/shared/filename_default.gif {} \;

– Chrytopher Karel

 find /home -name filename.gif -type f -printf "%h\0" | xargs -0 --max-args 1 cp -l /home/shared/filename_default.gif 

Ce n'est pas le caractère générique que vous avez demandé, mais cela accomplit la première partie de votre tâche, à savoir mettre " filename_default.gif " dans les directorys cibles. Si cela fonctionne comme vous le souhaitez, vous pouvez ensuite replace la partie ' cp -l /home/shared/filename_default.gif ' de la command par ' rm ', et replace ' -printf "%h\0" ' par ' -print0 ' -print0 'pour supprimer le file d'origine.

Cela suppose que vous souhaitez prendre le contenu de /home/shared/filename_default.gif et mettre ces contenus dans un file nommé ' filename_default.gif ' dans tous les directorys contenant ' filename.gif ', en supprimant ' filename.gif ' ( et donc replace efficacement les filename.gif nommés " filename.gif " par une image identique dans un file nommé ' filename_default.gif ')

Si vous souhaitez replace ' filename.gif ' mais laissez le nom identique, replace ' -printf "%h\0" ' par ' -print0 ' et omettre l'étape rm .

# find -type f -name 'filename.gif' -exec cp -v /home/shared/filename_default.gif {} \;

Cela replacea tous vos files "filename.gif" par le contenu de "filename_default.gif" mais ne renommera pas "filename.gif" à "filename_default.gif"

Pour renommer, utilisez la command suivante

# rename 's/filename.gif/filename_default.gif/' $(find -type f -name 'filename.gif')

HTH