comando cp para excluir ciertos archivos de la copia

35

¿Hay alguna manera de usar el comando 'cp' para copiar un directorio y excluir ciertos archivos / subdirectorios dentro de él?

Stephen Jacob
fuente

Respuestas:

57

Uso rsync:

rsync -avr --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination

Tenga en cuenta que el uso sourcey source/son diferentes. Una barra final medio para copiar el contenido de la carpeta sourceen destination. Sin la barra inclinada final, significa copiar el origen de la carpeta en destination.

Alternativamente, si tiene muchos directorios (o archivos) para excluir, puede usar --exclude-from=FILE, donde FILEestá el nombre de un archivo que contiene archivos o directorios para excluir.

--exclude también puede contener comodines, como --exclude=*/.svn*

Copiado de: https://stackoverflow.com/a/2194500/749232

Si quieres usarlo cpsolo:

find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'

Esto supone que la estructura del directorio de destino es la misma que la del origen.

Copiado de: https://stackoverflow.com/a/4586025/749232

saji89
fuente
3

Al final del juego, pero aquí hay una solución muy diferente que usa bash y cp simples: puede usar una especificación de archivo global mientras se ignoran algunos archivos.

Suponga que el directorio contiene los archivos:

$ ls *
listed1  listed2  listed3  listed4  unlisted1  unlisted2  unlisted3

Usando la variable GLOBIGNORE :

$ export GLOBIGNORE='unlisted*'
$ ls *
listed1  listed2  listed3  listed4

O con exclusiones más específicas:

$ export GLOBIGNORE='unlisted1:unlisted2'
$ ls *
listed1  listed2  listed3  listed4  unlisted3

O usando coincidencias negativas :

$ ls !(unlisted*)
listed1  listed2  listed3  listed4

Esto también admite varios patrones inigualables:

$ ls !(unlisted1|unlisted2)
listed1  listed2  listed3  listed4  unlisted3
xenoide
fuente
1
Para las coincidencias negativas, debe tener habilitados los globs extendidos: shopt -s extglobademás, no necesita exportar GLOBIGNORE: se supone que modifica el comportamiento del shell actual, a la mayoría de los programas secundarios no les importaría.
muru