Estoy tratando de copiar todos los archivos y carpetas de un directorio a otro, pero excluyo ciertos archivos. Específicamente, quiero excluir archivos y carpetas de subversión. Sin embargo, me gustaría una solución general pero concisa.
Me imagino que encontraré la necesidad de excluir varios tipos de archivos en el futuro cercano. Por ejemplo, podría querer excluir .svn, * .bak y * .prj.
Esto es lo que he reunido, pero no me funciona. La primera parte, buscar trabajos, pero estoy haciendo algo mal con xargs y cp . Intenté cp con y sin el -R
. Además, estoy usando OS X y parece tener una versión menos destacada de xargs que los sistemas Linux.
find ./sourcedirectory -not \( -name .svn -a -prune \)
| xargs -IFILES cp -R FILES ./destinationdirectory
find
comando usa correctamente-prune
para excluir elementos .svn, entonces pasa la-R
bandera a lacp
que le dice que ese comando sea recursivo. Cuando lo hace, pierde la granularidad que tenía en elfind
comando. Voy a jugar con esto por un minuto, pero creo que la respuesta es no usarlo-R
en elcp
comando.-R
bandera, estoy bastante seguro. Quite eso y que debe estar bien (aunque es posible que desee añadir-mindepth 1
a ignorar la carpeta directorio principal, que no desea copiar, supongo)Respuestas:
(Editado después de volver a leer la pregunta. El interlocutor dice que rsync no está instalado)
Un posible problema con su solución find / xargs son los espacios en los nombres de archivo. Para evitar eso, dile a find y xargs que usen un carácter nulo (ASCII 0) para separar los archivos encontrados:
Si encuentra que rsync está disponible, sigo pensando que rsync es la mejor solución:
Use rsync con la opción -C. Desde la página de manual de rsync :
Esto le dirá a rsync que ignore estos patrones:
Por ejemplo:
(nota: si aún no está familiarizado con rsync, asegúrese de leer en esa página de manual acerca de cómo rsync trata con una barra inclinada final en la ruta de origen. Se comporta de manera diferente si incluye la barra inclinada que si no lo hace. Buscar 'barra diagonal')
fuente
-R
bandera en laxargs
parte del comando.No es una solución general, pero ... puede usar el comando svn export para crear una copia del espacio de trabajo sin las carpetas de metadatos .svn.
fuente
si lo desea, incluso puede poner 'pv' o algo similar entre los 2 procesos tar.
fuente
Una manera sucia pero rápida y concisa:
Esto copia un directorio a otro (por lo tanto, la opción recursiva
-r
) y luego borra recursivamente cualquier cosa nombrada.svn
(ignorando mayúsculas y minúsculas).fuente
Lo haría de una manera diferente, usando tar y su mecanismo de exclusión.
Desde en el directorio de destino:
Esto creará un cd en la fuente, almacenará el contenido, excluirá lo que se enumera en excludefile y luego lo descomprimirá en el directorio actual.
fuente
Respuesta editada : El problema es que
-R
la copia es recursiva y, por lo tanto, terminas copiando los archivos ocultos. Esto es lo que usaría:La
-mindepth 1
bandera le dicefind
que ignore el directorio de nivel superior. Como desea copiar todo el contenido de ese directorio en un nuevo directorio de nivel superior, supongo que no quiere eso.Como dice Chris Nava en su respuesta , ya hay una forma integrada de hacer esto si hablamos de carpetas SVN, pero dado que solicitó una solución más general, esto puede ayudar un poco.
fuente
xargs
no está roto, pero en sistemas tipo Unix, el valor predeterminado es no usar nombres de archivo (o nombres de directorio) con espacios en ellos. Si tiene espacios o caracteres "divertidos" en sus nombres de archivo (o nombres de directorio), entonces debe hacer un trabajo adicional para lidiar con eso. (En GNUfind
, existe toda una sección en laman
página llamada "inusuales NOMBRE DE ARCHIVO" debido a este problema.) El-0
indicador enxargs
y-print0
para lafind
ayuda a manejar estos problemas. Sin embargo, te prometo que no quieres usarlo-R
en tu comando de copia. Deshacerá todo lo que haga para evitar los directorios SVN.Supongo que depende de cuán grande sea su árbol, pero ¿por qué no simplemente copie todo primero y luego recorte las carpetas .svn después de:
?
fuente
find
comando correcto , pero solo lo haces una vez. Puede usar el comando cientos de veces, una vez que lo haga bien.find
mejor, para no tener que hacerlo. Pero tienes razón: no hay nada realmente malo con esta solución.No olvides grep -v
fuente
También puedes hacer lo contrario. Copie todo y luego elimine las carpetas .svn con el siguiente comando:
fuente