Solución:
Usar rsync
:
rsync -avr --exclude="path1/to/exclude" --exclude="path2/to/exclude" source destination
Tenga en cuenta que el uso de source
y source/
son diferentes. Una barra diagonal significa copiar el contenido de la carpeta. source
dentro destination
. Sin la barra al final, significa copiar el origen de la carpeta en destination
.
Alternativamente, si tiene muchos directorios (o archivos) para excluir, puede usar --exclude-from=FILE
, dónde FILE
es 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 usar cp
sí mismo:
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 de la fuente.
Copiado de: https://stackoverflow.com/a/4586025/749232
Al final del juego, pero aquí hay una solución muy diferente que usa bash simple y cp: 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 incomparables:
$ ls !(unlisted1|unlisted2)
listed1 listed2 listed3 listed4 unlisted3