Como copiar arquivos ocultos e subdiretórios ocultos (os que começam com um ponto) na pasta A para a pasta B? Por exemplo, se eu tenho essa 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
a partir desta outra questão superusuário . No entanto, ele não copia os subdiretórios. Também tentei cp -r A/.* B
, mas ele copia, .
então eu termino com uma cópia exata de A (incluindo os arquivos normais). Qualquer ajuda é apreciada.
fonte
..c
,..*[^.]
mas perderá os arquivos que terminam com a.
. Eu acho que você realmente precisaria de globbing prolongado para realmente responder a todos os casos.O problema
A/.*
é que existe o diretório.
noA
qual também corresponde ao padrão.Você pode ativar os padrões estendidos de glob e usar o seguinte:
Ele corresponde aos 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,! (...) o nega, ou seja,! (? (.)) Corresponde a todo o resto do que nada ou um ponto).
fonte
.!(@(|.))
(AFAICT) é equivalente ao acima, (IMNSHO) um pouco mais claro e apenas um caractere a mais.Para casos como este, recomendo usar em
find
vez decp
: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 '.*'
: Para isso em ummaxdepth
dos diretórios 1 e cujoname
começa com.
.-exec cp -p {} B/ \;
: E uma vez que esses arquivos são encontrados,exec
ocp
comando com um-p
sinalizador para preservar datas / horas da origem ({}
) para o destino deB/
.Eu 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.fonte
find A -type d
fornece uma lista recursiva dentro de A apenas com diretóriosgrep -E "\."
filtra diretórios com um ponto (ou seja: diretórios ocultos)cp -r
copiar recursivamenteEu criei a estrutura de arquivos e pastas para A e executei o comando no Git Bash (não estou com um Linux no momento) e funcionou.
fonte
A B
e, em seguida, agiria inesperadamente, porque expandiria paracp -r A B/.dotfile B
. O conselho geral é não analisarfind
nem gerarls
saída . Se você usarfind
, também deverá usar suas próprias opções para filtrar e nãogrep
, e se canalizar afind
saída para outro lugar, use-print0
ou chame diretamente o comando desejado. Veja ofind
manual .extglob
ser configurados).find
análise então.Como alternativa, você pode usar este outro comando se o segundo caractere for alfanumérico ( origem ):
fonte
.@foo
ou..c
.