2010-09-08 9 views
29

veces necesito para llevar a cabo siguiente comandocomando cp debe pasar por alto algunos archivos

cp -rv demo demo_bkp 

Sin embargo, quiero hacer caso omiso de todos los archivos en el directorio .git. ¿Cómo logro eso? Lleva mucho tiempo copiar archivos .git y no necesito esos archivos.

+0

Posible duplicado de [Copiar carpeta recursivamente, excluyendo algunas carpetas] (http://stackoverflow.com/questions/2193584/copy-folder-recursively-exclusion-some-folders) –

Respuesta

71

Para ignorar un directorio de git específicamente, primero me try git export.

Pero en general, para copiar un árbol de directorios excluyendo ciertos archivos o carpetas, recomendaría usar rsync en lugar de cp. La sintaxis es casi igual, pero tiene rsync manera más opciones, incluyendo uno para excluir los archivos seleccionados:

rsync -rv --exclude=.git demo demo_bkp 

Véase, por ejemplo the man page para más información.

+0

No estoy seguro de si hay otras opciones que podrían haber evitado esto, o tiene algo que ver con las versiones de Linux, pero si sigo tu ejemplo, recibo 'demo' como un subdirectorio de' demo_bkp'. Sin embargo, usando 'rsync -rv --exclude =.git demo/demo_bkp' crea un nuevo directorio que contiene todos los archivos del primer directorio. –

8

OK. Prepárate. Esto no es bonito

find demo -depth -name .git -prune -o -print0 | cpio -0pdv --quiet demo_bkp 

¿Qué está pasando aquí?

  1. find demo | cpio -p demo_bkp encuentra archivos que emparejan cualquier criterio que desee y utiliza cpio copiarlos (denominada modo de "transferencia").

  2. find -depth cambia el orden en que se imprimen los archivos para que coincida con el orden que cpio desea.

  3. find -name .git -prune dice encontrar para no recurse abajo .git directorios.

  4. find -print0 | cpio -0 tiene encontrar el uso de caracteres NUL (\0) para separar los nombres de los archivos. Esto es para una máxima robustez en caso de que existan archivos con nombres extraños con espacios, líneas nuevas u otros caracteres inusuales.

  5. cpio -d crea directorios según sea necesario.

  6. cpio -v --quiet imprime cada nombre de archivo mientras se omite el mensaje "X blocks copy" que normalmente imprime cpio al final.

+0

Puede que no use esta solución para el dado caso, pero gracias por ilustrar su respuesta. Estoy seguro de que lo usaré en otro momento. –

2

creo que esto va a hacer el truco:

cd demo 
find . -not -path \*/.\* -type d -exec mkdir -p -- ../demo_bkp/{} \; 
find . -not -path \*/.\* -type f -exec cp -- {} ../demo_bkp/{} \; 

Primera encuentra y crea cada directorio. Luego encuentra y copia cada archivo.

Tenga en cuenta que no funcionará con archivos especiales (enlaces simbólicos, etc.).

Cuestiones relacionadas