Estou tentando copiar todos os arquivos e pastas de um diretório para outro, mas excluir determinados arquivos. Especificamente, quero excluir arquivos e pastas do subversion. No entanto, eu gostaria de uma solução geral, porém concisa.
Imagino que encontrarei a necessidade de excluir vários tipos de arquivos em um futuro próximo. Por exemplo, convém excluir .svn, * .bak e * .prj.
Aqui está o que eu montei, mas não está funcionando para mim. A primeira parte, encontrar obras, mas estou fazendo algo errado com xargs e cp . Eu tentei cp com e sem o -R
. Além disso, estou usando o OS X e parece ter uma versão menos característica do xargs do que os sistemas Linux.
find ./sourcedirectory -not \( -name .svn -a -prune \)
| xargs -IFILES cp -R FILES ./destinationdirectory
find
comando use corretamente-prune
para excluir itens .svn, você passa o-R
sinalizador para ocp
qual diz que esse comando é recursivo. Quando isso acontece, você perde a granularidade que tinha nofind
comando. Vou mexer nisso por um minuto, mas acho que a resposta é não usar-R
nocp
comando.-R
bandeira, tenho certeza. Retire isso e você deve estar bem (embora você pode querer adicionar-mindepth 1
a ignorar a pasta diretório principal que você não deseja copiar, presumo)Respostas:
(Editado após a leitura da pergunta. O questionador diz que o rsync não está instalado)
Um possível problema com sua solução find / xargs são os espaços nos nomes dos arquivos. Para contornar isso, diga a find e xargs para usar um caractere nulo (ASCII 0) para separar os arquivos encontrados:
Se você achar que o rsync está disponível, ainda acho que o rsync é a solução muito melhor:
Use rsync com a opção -C. Na página do manual rsync :
Isso instruirá o rsync a ignorar esses padrões:
Por exemplo:
(observação: se você ainda não está familiarizado com o rsync, leia nessa página de manual sobre como o rsync lida com uma barra no caminho de origem. Ele se comporta de maneira diferente se você incluir a barra do que se não o fizer. Procure por 'barra final')
fonte
-R
bandeira naxargs
parte do comando.Não é uma solução geral, mas ... você pode usar o comando svn export para criar uma cópia da área de trabalho sem as pastas de metadados .svn.
fonte
se você quiser, pode até colocar 'pv' ou algo semelhante entre os 2 processos tar.
fonte
Uma maneira suja, mas rápida e concisa:
Isso copia um diretório para outro (portanto, a opção recursiva
-r
) e, em seguida, apaga recursivamente qualquer coisa chamada.svn
(ignorando maiúsculas e minúsculas).fonte
Eu faria isso de uma maneira diferente, usando o tar e seu mecanismo de exclusão.
De no diretório de destino:
Isso fará um cd para a origem, tará o conteúdo, excluindo o que está listado em excludefile e, em seguida, descompactá-lo para o diretório atual.
fonte
Resposta editada : O problema é que
-R
torna a cópia recursiva e você acaba copiando os arquivos ocultos. Aqui está o que eu usaria:O
-mindepth 1
sinalizador indicafind
para ignorar o diretório de nível superior. Como você deseja copiar todo o conteúdo desse diretório para um novo diretório de nível superior, presumo que você não queira isso.Como Chris Nava diz em sua resposta , já existe uma maneira interna de fazer isso se estamos falando sobre pastas SVN, mas como você pediu uma solução mais geral, isso pode ajudar um pouco.
fonte
xargs
não está quebrado, mas em sistemas Unix, o padrão é não usar nomes de arquivos (ou nomes de diretórios) com espaços neles. Se você possui espaços ou caracteres "engraçados" em seus nomes de arquivos (ou nomes de diretórios), precisará fazer um trabalho extra para lidar com isso. (No GNUfind
, há uma seção inteira naman
página chamada "ARQUIVOS INCOMUNS", devido a esse problema.) O-0
sinalizadorxargs
e-print0
afind
ajuda para lidar com esses problemas. Prometo, no entanto, que você não deseja usar-R
no seu comando de cópia. Isso desfará o que você faz para evitar os diretórios SVN.Suponho que depende do tamanho da sua árvore, mas por que não copiar tudo primeiro e depois aparar as pastas .svn depois:
?
fonte
find
comando certo , mas você faz isso apenas uma vez. Você pode usar o comando centenas de vezes, depois de acertar.find
melhor, para não precisar fazer isso. Mas você está certo: não há nada realmente errado com esta solução.Não esqueça grep -v
fonte
Você também pode fazer o oposto. Copie tudo e exclua as pastas .svn usando o comando abaixo:
fonte