Finché cerchi solo file e cartelle nascosti a livello di A e non vuoi, ad esempio
A/b/.hidden
da copiare, dovresti essere in grado di usare questo:
cp -r A/.[^.]* B
In pratica significa copiare tutto ciò che inizia con .
e poi qualsiasi carattere diverso da .
Ciò esclude .
e ..
Modifica:rimosso -p dal comando cp poiché Asker non ha indicato di voler preservare proprietà, date, ecc.
Il problema con A/.*
è che c'è la directory .
in A
che corrisponde anche al pattern.
Puoi attivare i modelli glob estesi e utilizzare quanto segue:
shopt -s extglob
cp -r A/.!(?(.)) B
Corrisponde ai file il cui nome inizia con un punto e il cui secondo carattere non è né un punto né niente ( ?(.) corrisponde a niente o a un punto, !(...) lo nega, cioè !(?(.)) corrisponde a tutto il resto che niente o un punto).
Per casi come questo consigliamo di utilizzare find
invece di cp
come questo:
find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;
La sintassi di base si suddivide in questo modo:
find A/ -type f
:find
elementi nella directoryA/
il cui tipo è un file (invece di una directory)…-maxdepth 1 -name '.*'
:A questo per unmaxdepth
di 1 directory e di cuiname
inizia con.
.-exec cp -p {} B/ \;
:E una volta trovati questi file,exec
ilcp
comando con un-p
flag per preservare date/orari dalla fonte ({}
) alla destinazione diB/
.
Mi piace usare maxdepth
per aggiungere un livello di controllo in modo da non copiare accidentalmente un intero filesystem. Ma sentiti libero di rimuoverlo.