Como você copia todo o conteúdo de um diretório para outro?
Por exemplo:
$ cd /home/newuser
$ cp -a /backup/olduser/* .
O problema com o exposto acima é que o padrão de globing '*' corresponde aos diretórios ocultos '.' e '..' e você acaba com um diretório 'olduser' dentro de 'newuser', além do 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 é a maneira mais simples, correta, mais fácil de lembrar e não bagunça de mover o conteúdo de um diretório para outro usando apenas o comando básico 'cp' e o shell?
.
e..
trabalho. Gostaria de explicar?cp -r ./a b
não funcionou. Alguma idéia do porquê?r
opção não é necessária. Aa
opção implicar
.-a
parâmetro não faz nada para ajudar nessa situação. O comandocp -r ./a/. b
irá copiar o conteúdo, e apenas o conteúdo, de diretórioa
em diretóriob
. A-a
bandeira preserva links, timestamps etc., que não são relevantes para a pergunta.Dois diretórios a e b.
Ambos têm arquivos.
Você está em um diretório que contém a e b.
-r
= recursivamente.fonte
cp
para copiar um diretórioa
ea/.somedotfile
está contido ema
. seb
existir, este comando criará uma cópia exata dea
emb/a
.cp -R /some/dir/* /another/dir
Lembre-se de que, por padrão,
cp
copia o primeiro diretório para o segundo diretório, se o segundo existir.Por exemplo
cp -r a b
, copiará o diretórioa
parab
. Seb
não existir, ele será criado com o conteúdo dea
.Se você deseja copiar o conteúdo de
a
parab
(por exemplo, ao copiar um sistema de arquivos inteiro em um ponto de montagem), use:como na resposta anterior.
Observe também que
-a
, usado em algumas das outras respostas, é o mesmo que-dr --preserve=all
preservará registros de data e hora, contexto e atributos estendidos.fonte
/.
trabalho?a/.
representa o conteúdo do diretório 'a' em oposição ao próprio diretório; na maioria das situações, é sinônimo, mas ao usá-cp -r
lo, evita o comportamento padrão do cp (copiar um INTO b).A menos que você tenha reconfigurado seriamente seu shell, o padrão globbing '*' não corresponde '.' ou '..', como você pode verificar usando apenas eco *. O que ele faz é omitir arquivos cujo nome começa com um '.', Para que sua abordagem perca todos os arquivos ocultos. Você pode ajustar parte desse comportamento com as 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 ou duas vezes, recomendo que você analise o rsync ou o unison (dependendo das necessidades específicas) com especificações de origem e destino cuidadosamente criadas.
Outra alternativa é colocar o diretório de origem em um tarball e descompactá-lo sobre o diretório de destino existente.
fonte
( cd /src/dir ; tar cf - . ) | ( cd /dest/dir ; tar xf - )
... otar cf - .
tar é o diretório de origem, incluindo os dotfiles e o cospe no STDOUT, que é canalizado para o STDIN dotar xf -
.Isso copiará os arquivos normais e ocultos, excluindo o diretório pai (
..
):Se você não excluir o diretório pai, também receberá todo o conteúdo do
..
diretório de destino.fonte
..
(por exemplo,...
ou..super-hidden
).Para copiar arquivos que começam com um ponto, basta cp. * Target /
O mais fácil é executar o comando cp duas vezes.
Como Peter Eisentraut sais, as regras normais de globbing não incluem .. e. (hm, como terminar esta frase?;)
Apenas use -r para torná-lo recursivo e -i para fazer o cp perguntar se você realmente deseja substituir um arquivo.
fonte
*
não corresponde.
ou..
, mas se você usar.*
. Tenteecho .*
. Você pode excluir.
e..
com o seguinte padrão:.[^.]*
..[^.]*
ainda exclui nomes que começam com..
(por exemplo,...
ou..super-hidden
).Isso funciona para copiar todos os arquivos e diretórios, exceto os diretórios ocultos recursivamente do diretório atual para qualquer lugar:
fonte