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

6

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

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

Eu 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 de essa outra pergunta de 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.

    
por gaboroncancio 23.10.2014 / 15:15

5 respostas

10

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

A/b/.hidden

para ser copiado, você deve poder usar isto:

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

Basicamente, significa copiar qualquer coisa que comece com . e, em seguida, qualquer caractere diferente de . que filtra . e ..

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

    
por 23.10.2014 / 16:24
4

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

Você pode ativar os padrões de globos estendidos e usar o seguinte:

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

Ele combina arquivos cujo nome começa com um ponto e cujo segundo caractere não é nem um ponto nem nada (? (.) corresponde a nada ou um ponto,! (...) nega isto, ie! (? (.)) corresponde a tudo o mais que nada ou um ponto).

    
por 23.10.2014 / 15:23
2

Para casos como este, recomendamos o uso de find em vez de cp assim:

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

A sintaxe básica é dividida assim: find items no diretório A/ cujo tipo é um arquivo (em vez de um diretório) e faz isso para maxdepth de 1 diretórios e cujo name começa com %código%. E assim que esses arquivos forem encontrados, . o comando exec com um cp sinalizador para preservar datas / horas da origem ( -p ) para o destino de {} .

Eu gosto de usar B/ para adicionar uma camada de controle, portanto, não estou copiando acidentalmente um sistema de arquivos inteiro. Mas sinta-se à vontade para remover isso.

    
por 23.10.2014 / 16:25
0
 for item in 'find A -type d | grep -E "\."' ; do cp -r $item B ; done
  • find A -type d fornece uma lista recursiva dentro de A com apenas diretórios
  • grep -E "\." filtra diretórios com um ponto (por exemplo, diretórios ocultos)
  • a opção -E foi necessária aqui porque sem ela também significa "diretório atual"
  • a barra invertida é para evitar o significado, sob regexp, de "qualquer caractere"
  • cp -r para copiar recursivamente

Eu criei a estrutura de arquivos e pastas para A e executei o comando no Git Bash (não estou com um linux agora) e funcionou.

    
por 23.10.2014 / 15:53
0

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

cp -r A/.[a-zA-Z0-9]* B
    
por 23.10.2014 / 16:08