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


Como posso fazer cp -r cópia de absolutamente tudo 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 trabalhando, 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 sinalizador eu preciso usar?


294


origem


Mais respostas aqui, embora não pareçam tão boas; serverfault.com/questions/3154/… - Roel Van de Paar
Por favor, onze, considere alterar a resposta aceita para aquela dada por @bruno pereira, porque evita criar uma nova pasta. Se não, deixe que este comentário seja um aviso para os novos leitores verificarem também a outra resposta (mais votada). Tx. - Dr Beco


Respostas:


Não especifique os arquivos:

cp -r /etc/skel /home/user

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


214



É possível usar algo semelhante se /home/user/skel  faz existir? - bradley.ayers
@ bradley.ayers Eu acho que um poderia copiar em um subdiretório temporário, em seguida, movê-los para o nível superior (desde que a movimentação na mesma unidade é rápida). Menos que ideal, mas mais curto que outras soluções para mim. - Halil Özgür
@ bradley.ayers A resposta de Bruno abaixo resolve sua dúvida - Mark
Esta solução não funcionou para mim. Não copiou arquivos ocultos. Estou usando o CentOS 6.5. A solução de @ Bruno fez o truque. - Technext
No ubuntu / debian isso coloca o diretório 'skel' dentro do diretório de destino e não os arquivos recursed dentro do skel. Usar -T (sem alvo) por baixo para uso adequado. (-rT para recursivo) - bshea


Vamos dizer que você criou a nova pasta (ou vai 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>

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


378



Se eu não entendi errado, isso não copiou arquivos ocultos / ponto. - Halil Özgür
Funciona bem para mim. Note que o '.' é fundamental para o trabalho. - Mark
Isso funciona, mas por quê? Não é possível encontrar uma referência para isso no manual. - Julien Palard
Eu acho que funciona porque normalmente, isso criaria uma nova pasta com o nome da última pasta no primeiro argumento. No entanto, desde que esse nome é ., esse comportamento exigiria que ele criasse um diretório já existente, então ele simplesmente ignora essa etapa. - Zenexer
@Technext O globbing padrão no bash não inclui nomes de arquivos começando com um ., para mudar isso você precisa usar o shopt -s dotglob comando antes para poder incluir esses arquivos. Então com *, por padrão, você está pedindo para copiar todos os arquivos recursivamente deste diretório que pode ser expandido usando * (que não inclui arquivos ocultos por padrão). Enquanto no outro extremo . você está usando cp para recursivamente copiar tudo de "este diretório". - Bruno Pereira


bash em si tem uma boa solução, tem um 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)

Acima da solução é padrão de bash

NOTA:

shopt # without argument show status of all shell options
-u # abbrivation of unset 
-s # abbrivation of set

59



Isso é útil quando você deseja copiar apenas conteúdo sem criar um novo diretório no destino. Especialmente quando o destino é o ponto de montagem. - kaszynek
Esta é realmente a melhor resposta e chega ao cerne da questão. - Stephen
Está setopt para zsh, caso alguém esteja se perguntando. - Pat


O meio correto de fazer isso é usar o -T (--no-target-directory) opção, 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 arquivos ocultos), criando a pasta /home/user se não existe; No entanto, o -T opção impede o conteúdo de /etc/skel de ser copiado para uma nova pasta /home/user/skel deve a pasta /home/user existir.


45



Resposta correta. +1 - bshea
esta foi realmente a resposta certa - Gaetan


Use o rsync:

rsync -rtv source_folder/ destination_folder/


23





Se o seu diretório de origem e de destino tiver o mesmo nome, mesmo se o diretório de destino existir, 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

3



Ou você poderia simplesmente usar cp -r /etc/skel /home/user para renomear skel para user... - David
Isso mesmo, somente se / home / user ainda não existir. - Gabriel Hautclocq


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

2



Eu sempre usei cp -r. Obrigado por mencionar o cp -a - Pinaki Mukherjee


Você poderia 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 de manual do Rsync


2





Note que há um truque de linha de comando (funciona, pelo menos, sh, festançae ksh): Apenas sufixe o a partir de diretório com uma barra. Isso vai derramar o conteúdo do a partir de diretório para o para diretório (ironicamente, eu tinha aprendido sobre este 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

1





Eu vim aqui procurando uma solução para o mesmo problema no Google, então percebi que é fácil fazer com o find. 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.


1