Cópia de arquivo recursiva e não substituindo?

21

Eu tenho um diretório que contém várias outras pastas que contêm arquivos CoffeeScript / JavaScript. Consigo compilar os arquivos CoffeeScript em uma nova pasta com a mesma estrutura de pastas.

O que eu quero fazer é copiar todos os arquivos * .js na pasta de origem para a pasta de destino recursivamente. Também não quero substituir nenhum arquivo que já esteja presente na pasta de destino. Alguma idéia de como fazer isso?

Tentei usar cp -n source/**.js desination/e cp -Rn source/**.js desination/depois de examinar outra pergunta semelhante, mas ela não parece estar funcionando.

Alguma idéia de como fazer isso?

AlbertEngelB
fonte
Você deu uma olhada no rsync?
bonob
@bonob eu não tenho. Eu usei uma ou duas vezes, mas apenas para obter arquivos remotamente.
precisa saber é o seguinte

Respostas:

25

Você pode usar o rsync (também copia localmente)

rsync -r --ignore-existing --include=*/ --include=*.js --exclude=* source/ destination
  • -r recursão em diretórios,
  • --ignore-existing ignorar arquivos existentes no destino,
  • os filtros includee excludesignificam: incluir todos os diretórios, incluir todos os arquivos * .js, excluir o restante; a primeira inclusão é necessária; caso contrário, a exclusão final também excluirá os diretórios antes que o conteúdo seja verificado.

Por fim, você pode adicionar um -Pse quiser assistir ao progresso, um --list-onlyse quiser ver o que ele copiaria sem realmente copiar e um -tse quiser preservar os carimbos de data e hora.


Isso não está relacionado, mas aprendi o comando rsync recentemente, quando mudei 15 anos de documentos de uma partição para outra. Confiante de que meus arquivos estavam lá, limpei a partição antiga e coloquei outras coisas lá; Percebi depois que perdi todos os carimbos de data e hora e descobri a bandeira -t. Só queria compartilhar minha angústia: '(

bonob
fonte
Haha, este funcionou! rsyncaparentemente é a bomba.
AlbertEngelB
3
Sim, eu mal o conheço, mas aprendi muito sobre isso tentando responder à sua pergunta. Se você precisar ir mais longe no futuro, poderá definir filtros complexos em arquivos e chamá-los no comando, por exemplo. Você também pode ter filtros por diretório, compactar dados ao copiar, e isso apenas arranha a superfície!
bonob
7

Isso também é possível usando o cp. Veja aqui:

sudo cp -vnpr /xxx/* /yyy

xxx = origem

aaaa = destino

v = detalhado

n = sem acumulador (sem substituição)

p = preservar permissões

r = recursivo

SEMbyotic
fonte
5

Olhando para as páginas de manual, parece que você deseja a -nopção.

-n, --no-clobber
   do not overwrite an existing file (overrides the previous -i option)
tântalo
fonte
Eu tentei usar -n, no entanto, ele não me permite filtrar por arquivos * .js.
precisa saber é o seguinte
0

Minha distribuição não possuía trator disponível, então:

echo n | cp -vipr xxx yyy

xxx = origem

aaaa = destino

v = detalhado

i = interativo (prompt para substituir) | é por isso que o comando é precedido por "echo n |"

p = preservar permissões

r = recursivo

Otaviano
fonte