2009-10-13 10 views
26

Cualquier persona tiene una forma alternativa de encontrar y copiar archivos en bash que:Bash: encontrar y copiar

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

Me gusta esta manera porque es flexible, ya que estoy construyendo mi mando (puede ser cualquier comando) y ejecutarlo después.

¿Hay otras formas de simplificar los comandos a una lista de archivos?

Gracias

+1

Q similares y un 1 + 1/2 años después: http://stackoverflow.com/ q/5241625/1172302 –

Respuesta

62

Yo recomiendo usar find 's -exec opción:

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

Como siempre, consulte la página de manual para obtener mejores resultados.

+0

La página del manual de búsqueda sugiere el uso de comillas simples alrededor de las llaves, ya que puede malinterpretarse sin ellas. –

+4

Debería reemplazar '\;' con '+' para evitar ejecutar 'cp' cada vez. – BroSlow

+3

@BroSlow No estoy seguro de por qué, pero esto solo funciona con \; y con + obtengo 'argumento faltante para -exec'. – hayavuk

8

que suelen utilizar éste:

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

-exec es probable que el camino a seguir, a menos que tenga demasiados archivos. Luego usa xargs.

4

Puede hacerlo con xargs:

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

Ver también grep utility in shell script.

+1

Esto tiene la ventaja de ser más rápido que 'find -exec' porque no crea un nuevo proceso' cp' para cada archivo. Sin embargo, si tiene GNU find, puede hacer 'find -exec ... +' en lugar de 'find -exec ... ';' 'para el mismo efecto :) – hobbs

8

Si su cp es GNU de:

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

Utilice esta opción para copiar y muchas otras cosas:

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