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/.* B
fromesta 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 A
qual 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 usarfind
em vez decp
assim:
find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;
A sintaxe básica se divide assim:
find A/ -type f
:find
itens no diretórioA/
cujo tipo é um arquivo (em vez de um diretório)…-maxdepth 1 -name '.*'
: Isto para ummaxdepth
diretório de 1 e cujoname
início começa com.
.-exec cp -p {} B/ \;
: E uma vez encontrados esses arquivos,exec
ocp
comando com um-p
sinalizador para preservar datas/horas da origem ({}
) até o destino deB/
.
Gosto de usar maxdepth
para 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