Como posso cp -r
copiar absolutamente todos os 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 é necessário confiar na 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?
Respostas:
Não especifique os arquivos:
(Observe que ainda
/home/user
não deve existir, caso contrário, ele será criado/home/user/skel
.)fonte
/home/user/skel
não existe?-T
(sem alvo) abaixo para o uso adequado. (-rT
for recursivo)Digamos que você criou a nova pasta (ou vai criar uma) e deseja copiar os arquivos para ela após a criação da pasta
Isso copiará todos os arquivos / pastas recursivamente de
/etc/skel
para a pasta já existente criada na primeira linha.fonte
.
, esse comportamento exigiria a criação de um diretório já existente; portanto, apenas pula essa etapa..
, para alterar que você precisa usar oshopt -s dotglob
comando antes para poder incluir esses arquivos. Portanto*
, com , por padrão, você está pedindo para copiar todos os arquivos recursivamente deste diretório que pode ser expandido usando*
(o que não inclui arquivos ocultos por padrão). Enquanto do outro lado,.
você está usando o cp para copiar recursivamente tudo de "este diretório".O meio correto de fazer isso é usar a
-T (--no-target-directory)
opção e copiar recursivamente as pastas (sem barras, asteriscos etc.), ou seja: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-T
opção impede que o conteúdo/etc/skel
seja copiado para uma nova pasta,/home/user/skel
caso ela/home/user
exista.fonte
bash
em si tem uma boa solução, tem umshell option
, você podecp
,mv
e assim por diante .:e
A solução acima é padrão de
bash
NOTA:
fonte
setopt
para o zsh, caso alguém esteja se perguntando.Use rsync:
rsync -rtv source_folder/ destination_folder/
fonte
rsync
é bom, mas outra opção:Da ajuda principal:
fonte
Se o diretório de origem e destino tiver o mesmo nome, mesmo se o diretório de destino existir, você pode simplesmente digitar:
Isso 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:
fonte
cp -r /etc/skel /home/user
para renomearskel
auser
...Você pode usar o rsync.
Você pode até copiar sobre ssh
Existem vários sinalizadores que você pode usar: -a, --archive # archive (-rlptgoD)
Página de manual Rsync
fonte
A maneira mais simples é:
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, poderá usar a
cp
propriedade, que é a capacidade de especificar várias fontes para uma pasta de destino:fonte
..anything
ou...anything
etc. - stackoverflow.com/a/31438355/2351568 contém o regex correto para esse problema. || mas de qualquer maneira usandoshopt -s dotglob
ainda é a melhor solução!.
e..
(que é equivalente à pasta atual e à sua pasta). || mas ainda assim a resposta no link explica mais e fornece uma solução.Observe que há um truque da linha de comando (funciona em, pelo menos, sh , bash e ksh ): basta sufixo o diretório from com uma barra. Isso colocará o conteúdo do diretório from no diretório to (ironicamente, eu aprendi sobre esse truque ao usar o rsync ).
Exemplo:
fonte
Eu vim aqui pesquisando no Google uma solução para o mesmo problema, então percebi que é fácil encontrar a localização. A vantagem não depende do shell ou de utilitários especiais que podem não estar instalados.
Eu tentei o truque com barra à direita, mas isso não funcionou para mim.
fonte
Minha solução para esse problema quando tenho que copiar todos os arquivos (incluindo
.
arquivos) para um diretório de destino mantendo as permissões é: (substituir, se já existir)yes
é para substituir automaticamente os arquivos de destino,r
recursivo,v
detalhado ep
reter permissões.Observe que o caminho de origem não está terminando com um
/
(para que todos os arquivos / diretório e. Arquivos sejam copiados)O diretório de destino termina
/
quando colocamos o conteúdo da pasta de origem no destino como um todo.fonte
Eu vi que o cp nem sempre copia arquivos ocultos e se você deseja um comando que parece funcionar em todos os dialetos linux / unix, tente usar:
fonte
Desde pelo menos o K3b 2.0.3, existe uma caixa de perguntas 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 perguntar sobre como incluir links. Coisas legais!
fonte