2009-10-13 9 views
26

Tout le monde a une autre façon de trouver et copier des fichiers dans bash que:Bash: trouver et copier

find . -ctime -15 | awk '{print "cp " $1 " ../otherfolder/"}' | sh

J'aime cette façon parce qu'il est flexible, que je construis ma commande (puis par tout commande) et l'exécuter après.

Existe-t-il d'autres façons de rationaliser les commandes à une liste de fichiers?

Merci

+1

Q & A 1 similaires + 1/2 ans plus tard: http://stackoverflow.com/ q/5241625/1172302 –

Répondre

62

Je vous conseille d'utiliser find « s 'option -exec:

find . -ctime 15 -exec cp {} ../otherfolder \;

Comme toujours, consultez la page de manuel pour de meilleurs résultats.

+0

La page find man suggère d'utiliser des guillemets simples autour des accolades, car ils peuvent être mal interprétés sans eux. –

+4

Vous devriez remplacer '\;' par '+' pour éviter de lancer 'cp' à chaque fois. – BroSlow

+3

@BroSlow Je ne sais pas pourquoi mais cela ne fonctionne qu'avec \; et avec + j'ai l'argument 'manquant' pour'exec '. – hayavuk

8

Je l'habitude d'utiliser celui-ci:

find . -ctime -15 -exec cp {} ../otherfolder/ \; 
-1

exec est probablement le chemin à parcourir, à moins que vous avez beaucoup trop de fichiers. Ensuite, utilisez xargs.

4

Vous pouvez le faire avec xargs:

$ find . -ctime 15 -print0 | xargs -0 -I{} cp {} ../otherfolder 

Voir aussi grep utility in shell script.

+1

Cela a l'avantage d'être plus rapide que 'find -exec' car il ne crée pas de nouveau processus' cp' pour chaque fichier. Cependant si vous avez GNU find vous pouvez faire 'find -exec ... +' au lieu de 'find -exec ... ';'' pour le même effet :) – hobbs

8

Si votre cp est GNU de:

 
find . -ctime 15 -print0 | xargs -0 cp --target-directory=../otherfolder 
1

Utilisez ce pour la copie et bien d'autres choses:

for f in (find /apps -type f -name 'foo'); do cp ${f} ${f}.bak; cmd2; cmd3; done; 
Questions connexes