Como copiar arquivos e subdiretórios ocultos (começando com um ponto) no Linux?

Como copiar arquivos e subdiretórios ocultos (começando com um ponto) no Linux?

Como copiar arquivos e subdiretórios ocultos (aqueles que começam com um ponto) da pasta A para a pasta B? Por exemplo, se eu tiver esta estrutura:

A/a
A/b
A/.a
A/.b/
A/.b/somefile
A/.b/.c

Gostaria de copiar para B apenas os arquivos ocultos e subdiretórios ocultos em A:

B/.a
B/.b/
B/.b/somefile
B/.b/.c

Eu já tentei este comando: cp A/.* Bfromesta outra pergunta do superusuário. No entanto, ele não copia os subdiretórios. Também tentei cp -r A/.* B, mas copia .então termino com uma cópia exata de A (incluindo os arquivos normais). Qualquer ajuda é apreciada.

Responder1

Contanto que você esteja procurando apenas arquivos e pastas ocultos no nível A e não queira, por exemplo

A/b/.hidden

a ser copiado, você poderá usar isto:

cp -r A/.[^.]* B

Basicamente significa copiar qualquer coisa que comece com a .e depois qualquer caractere diferente de a .Isso filtra .e..

Editar: Removido o -p do comando cp, pois Asker não indicou que deseja preservar quaisquer propriedades, datas, etc.

Responder2

O problema A/.*é que existe o diretório .no Aqual também corresponde ao padrão.

Você pode ativar padrões globais estendidos e usar o seguinte:

shopt -s extglob
cp -r A/.!(?(.)) B    

Ele corresponde a arquivos cujo nome começa com um ponto e cujo segundo caractere não é um ponto nem nada ( ?(.) corresponde a nada ou a um ponto, !(...) nega, ou seja, !(?(.)) corresponde a todo o resto do que nada ou um ponto).

Responder3

Para casos como este, recomendo usarfindem vez decpassim:

find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;

A sintaxe básica se divide assim:

  • find A/ -type f: finditens no diretório A/cujo tipo é um arquivo (em vez de um diretório)…
  • -maxdepth 1 -name '.*': Isto para um maxdepthdiretório de 1 e cujo nameinício começa com ..
  • -exec cp -p {} B/ \;: E uma vez encontrados esses arquivos, execo cpcomando com um -psinalizador para preservar datas/horas da origem ( {}) até o destino de B/.

Gosto de usar maxdepthpara adicionar uma camada de controle para não copiar acidentalmente um sistema de arquivos inteiro. Mas fique à vontade para remover isso.

Responder4

Como alternativa, você pode usar este outro comando se o segundo caractere for alfanumérico (fonte):

cp -r A/.[a-zA-Z0-9]* B

informação relacionada