Copie o conteúdo do diretório usando o comando 'cp'

33

Como você copia todo o conteúdo de um diretório para outro?

Por exemplo:

$ cd /home/newuser
$ cp -a /backup/olduser/* .

O problema acima é que o padrão de globalização '*' corresponde aos diretórios ocultos '.' e '..' e você acaba com um diretório 'olduser' dentro de 'newuser', assim como o conteúdo.

Você também pode fazer algo assim:

$ rmdir /home/newuser
$ cp -a /backup/olduser /home/newuser

Mas e se newuser já contiver alguns arquivos e diretórios padrão?

Qual é o mais simples, mais correto, mais fácil de lembrar e não bagunçar a maneira de mover o conteúdo de um diretório para outro usando apenas o comando básico 'cp' e o shell?

    
por Der Hochstapler 20.08.2009 / 19:06

7 respostas

30

Tente:

cp -ra /backup/olduser/. /home/newuser
    
por 20.08.2009 / 19:41
23

Dois diretórios a e b.

Ambos têm arquivos em.

Você está em um diretório que contém a e b.

cp -r ./a b

-r = recursivamente.

    
por 20.08.2009 / 19:12
18

Lembre-se também que, por padrão, cp copia o primeiro diretório para o segundo diretório, se o segundo existir. Por exemplo, cp -a a b copiará um INTO b se b existir, isto é, criará um em b.

Se não é o que você quer, e você quer copiar o conteúdo de um em b (por exemplo ao copiar um sistema de arquivos inteiro em um ponto de montagem) use:

cp -a a/. b

como na resposta anterior.

Observe também que -a inclui -r , então -ar é redundante.

    
por 23.10.2009 / 12:25
6

A menos que você tenha seriamente reconfigurado seu shell, o padrão de globbing '*' não corresponde a '.' ou '..', como você pode verificar usando apenas echo *. Em vez disso, o que ele faz é omitir arquivos cujo nome começa com um '.', Portanto, sua abordagem perderá todos os arquivos ocultos. Você pode ajustar alguns desses comportamentos com opções de shell, por exemplo, a opção dotglob no bash, mas não será a opção portátil e robusta que você está procurando.

Se você precisar fazer isso mais de uma vez ou duas vezes, recomendo analisar o rsync ou o uníssono (dependendo das necessidades específicas) com especificações de origem e de destino cuidadosamente elaboradas.

Outra alternativa é colocar o diretório de origem em um tarball e descompactá-lo sobre o diretório de destino existente.

    
por 03.09.2009 / 14:27
2

Isso copiará os arquivos normais e ocultos, excluindo o diretório pai ( .. ):

cd /directory/to/copy
cp -r * .[^.]* /destination/directory

Se você não excluir o diretório pai, também acabará com todo o conteúdo de .. em seu diretório de destino.

    
por 07.11.2009 / 22:55
0

Para copiar arquivos que começam com um ponto, basta fazer cp. * target /

É mais fácil fazer o comando cp duas vezes.

Como Peter Eisentraut diz que regras normais de globbing não incluem .. e. (hm, como terminar esta sentença?;)

Apenas use -r para torná-lo recursivo e -i para fazer o cp perguntar se você realmente quer sobrescrever um arquivo.

cp -ri /backup/olduser/* /newuser/
cp -ri /backup/olduser/.* /newuser/
    
por 03.09.2009 / 16:30
0

Isso funciona para copiar todos os arquivos e diretórios, exceto os diretórios ocultos recursivamente do diretório atual para qualquer lugar:

cp -rf * ^.* 
    
por 04.07.2011 / 20:43

Tags