Como copiar com o cp para incluir arquivos ocultos e diretórios ocultos e seu conteúdo?

313

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

Requisitos:

  • Inclua arquivos ocultos e diretórios ocultos.
  • Seja um único comando com um sinalizador para incluir o acima.
  • Não precisa depender da correspondência de padrões.

Meu feio, mas funciona, hack é:

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

Como posso fazer isso tudo em um comando sem a correspondência de padrões? Qual bandeira eu preciso usar?

    
por eleven81 27.10.2009 / 20:46

13 respostas

225

Não especifique os arquivos:

cp -r /etc/skel /home/user

(Observe que /home/user não deve existir já, senão criará /home/user/skel .)

    
por 27.10.2009 / 20:55
396

Digamos que você criou a nova pasta (ou irá criar uma) e deseja copiar os arquivos para ela depois que a pasta for criada

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

Isso copiará todos os arquivos / pasta recursivamente de /etc/skel para a pasta já existente criada na primeira linha.

    
por 12.12.2011 / 23:00
61

bash em si tem uma boa solução, tem shell option , você pode cp , mv e assim por diante.:

shopt -s dotglob # for considering dot files (turn on dot files)

e

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

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

NOTA:

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set
    
por 06.02.2013 / 02:14
53

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

cp -rT /etc/skel /home/user

Isso copiará o conteúdo de /etc/skel para /home/user (incluindo arquivos ocultos), criando a pasta /home/user se ela não existir; no entanto, a opção -T impede que o conteúdo de /etc/skel seja copiado para uma nova pasta /home/user/skel se a pasta /home/user existir.

    
por 08.09.2015 / 23:50
23

Use o rsync:

rsync -rtv source_folder/ destination_folder/

    
por 20.02.2014 / 14:18
3

Se o seu diretório de origem e de destino tiver o mesmo nome, mesmo que exista um diretório de destino, você poderá simplesmente digitar:

cp -R /etc/skel /home/

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

Eventualmente, você pode copiar o diretório e renomeá-lo em uma única linha:

cp -R /etc/skel /home/ && mv /home/skel /home/user
    
por 16.05.2013 / 10:38
2

rsync é bom, mas outra opção:

cp -a src/ dst/

Da ajuda principal:

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

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

   -R, -r, --recursive
          copy directories recursively
    
por 28.08.2014 / 19:46
2

Você pode usar o rsync.

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

Você pode até copiar ssh

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

Existem várias bandeiras que você 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.

Página man do Rsync

    
por 17.01.2016 / 18:32
1

Note que existe um truque de linha de comando (funciona, pelo menos, sh , bash , e ksh ): Apenas sufixo o diretório de com uma barra. Isto irá derramar o conteúdo do diretório de no diretório para (ironicamente, eu aprendi sobre esse truque quando usando 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
    
por 12.05.2015 / 22:00
1

Eu vim aqui procurando uma solução para o mesmo problema no Google, depois percebi que é fácil de encontrar. A vantagem não depende do shell ou de utilitários especiais que podem não estar instalados.

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

Eu tentei o truque com barra, mas isso não funcionou para mim.

    
por 24.07.2015 / 15:34
1

Minha solução para este problema quando tenho que copiar todos os arquivos (incluindo . files) para um diretório de destino mantendo as permissões é: (substituir se já existe)

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

yes é para substituir automaticamente os arquivos de destino, r recursiva, v verbose p reter permissões.

Observe que o caminho de origem não está terminando com / (para que todos os arquivos / diretório e arquivos sejam copiados)

O diretório de destino termina com / , pois estamos colocando o conteúdo da pasta de origem no destino como um todo.

    
por 30.01.2018 / 21:42
1

A maneira mais simples é:

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

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

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

cp -r /etc/skel/* /etc/skel/.* /home/user
    
por 06.06.2018 / 18:13
-2

A partir de pelo menos o K3b 2.0.3, há uma caixa de pergunta que aparece quando o diretório é adicionado ao projeto, que pergunta se você deseja incluir arquivos ocultos ... há também uma pergunta que aparece para pergunte sobre incluir links. Coisas legais!

    
por 14.12.2016 / 22:57