Existe uma maneira de usar o comando 'cp' para copiar um diretório e excluir certos arquivos / subdiretórios dentro dele?
Existe uma maneira de usar o comando 'cp' para copiar um diretório e excluir certos arquivos / subdiretórios dentro dele?
Respostas:
Use rsync
:
rsync -avr --exclude='path1/to/exclude' --exclude='path2/to/exclude' source destination
Observe que usar source
e source/
é diferente. Uma barra à direita significa copiar o conteúdo da pasta source
para destination
. Sem a barra final, significa copiar a origem da pasta para destination
.
Como alternativa, se você tiver muitos diretórios (ou arquivos) a serem excluídos, poderá usar --exclude-from=FILE
, onde FILE
é o nome de um arquivo que contém arquivos ou diretórios a serem excluídos.
--exclude
também pode conter curingas, como --exclude=*/.svn*
Copiado de: https://stackoverflow.com/a/2194500/749232
Se você deseja usar- cp
se:
find . -type f -not -iname '*/not-from-here/*' -exec cp '{}' '/dest/{}' ';'
Isso pressupõe que a estrutura do diretório de destino seja igual à da origem.
Copiado de: https://stackoverflow.com/a/4586025/749232
No final do jogo, mas aqui está uma solução muito diferente usando o bash e o cp: você pode usar uma especificação de arquivo global enquanto alguns arquivos são ignorados.
Suponha que o diretório contenha os arquivos:
$ ls *
listed1 listed2 listed3 listed4 unlisted1 unlisted2 unlisted3
Usando a variável GLOBIGNORE :
$ export GLOBIGNORE='unlisted*'
$ ls *
listed1 listed2 listed3 listed4
Ou com exclusões mais específicas:
$ export GLOBIGNORE='unlisted1:unlisted2'
$ ls *
listed1 listed2 listed3 listed4 unlisted3
Ou usando correspondências negativas :
$ ls !(unlisted*)
listed1 listed2 listed3 listed4
Isso também suporta vários padrões incomparáveis:
$ ls !(unlisted1|unlisted2)
listed1 listed2 listed3 listed4 unlisted3
shopt -s extglob
também não precisa exportarGLOBIGNORE
: deve modificar o comportamento do shell atual, a maioria dos programas filhos não se importaria com isso.