2009-10-27 19:46:06 +0000 2009-10-27 19:46:06 +0000
423
423

Como copiar com cp para incluir arquivos e diretórios ocultos e seus conteúdos?

Como posso fazer cp -r copiar absolutamente todos os arquivos e diretórios em um diretório

Requisitos:

  • Incluir arquivos e diretórios ocultos.
  • Ser um único comando com uma bandeira para incluir o acima mencionado.
  • Não é necessário confiar na correspondência de padrões.

O meu hack feio, mas funcional, é:

cp -r /etc/skel/* /home/user
cp -r /etc/skel/.[^.]* /home/user

Como posso fazer tudo isto num único comando sem a correspondência de padrões? Que bandeira preciso de usar?

Respostas (14)

492
492
492
2011-12-12 22:00:01 +0000

Digamos que criou a nova pasta (ou vai criar uma) e quer copiar os ficheiros para ela após a pasta ter sido criada

mkdir /home/<new_user>
cp -r /etc/skel/. /home/<new_user>

Isto irá copiar recursivamente todos os ficheiros/pastas de /etc/skel para a pasta já existente criada na primeira linha.

281
281
281
2009-10-27 19:55:27 +0000

Não especifique os ficheiros:

cp -r /etc/skel /home/user

(Note que o /home/user não deve já existir, caso contrário criará o /home/user/skel).

95
95
95
2015-09-08 21:50:45 +0000

A forma correcta de o fazer é utilizar a opção -T (--no-target-directory), e copiar recursivamente as pastas (sem barras, asteriscos, etc.), ou seja:

cp -rT /etc/skel /home/user

Isto irá copiar o conteúdo de /etc/skel para /home/user (incluindo ficheiros ocultos), criando a pasta /home/user se esta não existir; contudo, a opção -T impede que o conteúdo de /etc/skel seja copiado para uma nova pasta /home/user/skel caso a pasta /home/user exista.

68
68
68
2013-02-06 01:14:47 +0000

bash em si tem uma boa solução, tem um shell option, Pode cp, mv e assim por diante:

shopt -s dotglob # for considering dot files (turn on dot files)
shopt -u dotglob # for don't considering dot files (turn off dot files)

A solução acima é padrão de bash

NOTE:

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set
29
29
29
2014-02-20 13:18:25 +0000

Use rsync:

rsync -rtv source_folder/ destination_folder/

7
7
7
2014-08-28 17:46:19 +0000

rsync é bom, mas outra escolha:

cp -a src/ dst/

A partir da ajuda principal:

-a, --archive
          same as -dR --preserve=all

   -d same as --no-dereference --preserve=links

   -R, -r, --recursive
          copy directories recursively
5
5
5
2018-06-06 16:13:41 +0000

A forma mais simples é:

cp -r /etc/skel/{.,}* /home/user

A expressão {.,}* inclui todos os ficheiros e directórios (também começando com um ponto).

Se não quiser usar a expressão acima, pode usar a propriedade cp, que é a capacidade de especificar várias fontes para uma pasta de destino:

cp -r /etc/skel/* /etc/skel/.* /home/user
4
4
4
2016-01-17 17:32:26 +0000

Pode usar rsync.

rsync -aP ./from/dir/ /some/other/directory/

Até pode copiar sobre ssh

rsync -aP ./from/dir/ username@remotehost:/some/other/directory/

Há várias bandeiras que pode usar: -a, –archive # archive (-rlptgoD)

-r, --recursive
-l, --links # copy symlinks as links
-p, --perms # preserve permissions
-t, --times # preserve times
-g, --group # preserve group
-o, --owner # preserve owner
-D # --devices --specials

--delete # Delete extra files

You may want to add the -P option to your command.

--partial # By default, rsync will delete any partially transferred file if the transfer is interrupted. In some circumstances it is more desirable to keep partially transferred files. Using the --partial option tells rsync to keep the partial file which should make a subsequent transfer of the rest of the file much faster.

-P # The -P option is equivalent to --partial --progress. Its purpose is to make it much easier to specify these two options for a long transfer that may be interrupted.

Rsync man page

4
4
4
2013-05-16 08:38:46 +0000

Se o seu directório de origem e de destino têm o mesmo nome, mesmo que o directório de destino exista, pode simplesmente escrever:

cp -R /etc/skel /home/

Isto irá copiar o directório /etc/skel para /home/, incluindo ficheiros e directórios ocultos.

Eventualmente, pode copiar o directório e renomeá-lo numa única linha :

cp -R /etc/skel /home/ && mv /home/skel /home/user
3
3
3
2015-07-24 13:34:27 +0000

Cheguei aqui tendo procurado no Google uma solução para o mesmo problema, depois percebi que é fácil de encontrar. A vantagem não depende da concha, ou de utilidades especiais que podem não ser instaladas.

find /etc/skel/ -mindepth 1 -exec cp -r {} /home/username/ \;

Tentei o truque com o trailing slash, mas isso não funcionou para mim.

2
2
2
2018-01-30 20:42:49 +0000

A minha solução para este problema quando tenho de copiar todos os ficheiros* (incluindo os ficheiros .) para um directório de destino reter as permissões* é: (sobrescrever se já existir)

yes | cp -rvp /source/directory /destination/directory/

yes é para sobrescrever automaticamente ficheiros de destino, r recursivo, v verboso, p reter permissões.

Repare que o caminho de origem não termina com um / (por isso todos os ficheiros/directório e ficheiros . são copiados)

O directório de destino termina com / uma vez que estamos a colocar o conteúdo da pasta de origem no destino como um todo.

2
2
2
2015-05-12 20:00:58 +0000

Note que existe um truque de linha de comando (funciona em, pelo menos, sh, bash, e ksh): Basta sufixar o de directório com uma barra oblíqua. Isto irá verter o conteúdo do directório from para o directório to (ironicamente, eu tinha aprendido este truque pela primeira vez quando using rsync).

Exemplo:

/tmp$ mkdir test_dir1
/tmp$ cd test_dir1/
/tmp/test_dir1$ touch aa
/tmp/test_dir1$ touch .bb
/tmp/test_dir1$ cd ..
/tmp$ mkdir test_dir2

/tmp$ cp -r test_dir1/* test_dir2
/tmp$ ls -1a test_dir2
.
..
aa

/tmp$ cp -r test_dir1/ test_dir2
/tmp$ ls -1a test_dir2
.
..
.bb
aa
1
1
1
2019-02-13 10:18:49 +0000

Vi que o cp nem sempre copia ficheiros escondidos e se quiser um comando que parece funcionar em todos os dialectos linux/unix deve tentar usar:

cd /etc/skel
find | cpio -pdumv /home/user
-2
-2
-2
2016-12-14 21:57:06 +0000

A partir de pelo menos K3b 2.0.3, há uma caixa de perguntas que aparece quando o directório é adicionado ao projecto, que pergunta se quer incluir ficheiros escondidos … há também uma pergunta que aparece para perguntar sobre a inclusão de links. Coisas boas!