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
.)
Como posso fazer cp -r
copiar absolutamente todos dos arquivos e diretórios em um diretório
Requisitos:
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?
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.
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
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.
Use o rsync:
rsync -rtv source_folder/ destination_folder/
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
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
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
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
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.
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.
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
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!