Tente:
cp -ra /backup/olduser/. /home/newuser
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?
Tente:
cp -ra /backup/olduser/. /home/newuser
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.
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.
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.
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.
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/
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 * ^.*