Pokud například hledáte skryté soubory a složky na úrovni A a nechcete
A/b/.hidden
ke zkopírování byste měli být schopni použít toto:
cp -r A/.[^.]* B
V podstatě to znamená zkopírovat cokoliv, co začíná .
a poté jakýkoli znak jiný než .
Tím se odfiltruje .
a ..
Edit:Odstraněno -p z příkazu cp, protože Asker neuvedl, že chce zachovat nějaká vlastnictví, data atd.
Problém s A/.*
je, že existuje adresář .
v A
který také odpovídá vzoru.
Můžete zapnout rozšířené vzory globusů a použít následující:
shopt -s extglob
cp -r A/.!(?(.)) B
Vyhovuje soubory, jejichž název začíná tečkou a jejichž druhý znak není ani tečka, ani nic ( ?(.) neodpovídá ničemu nebo tečce, !(...) to neguje, tj. !(?(.)) odpovídá všemu ostatnímu než nic nebo tečka).
Pro takové případy doporučujeme použít find
místo cp
takhle:
find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;
Základní syntaxe se rozpadá takto:
find A/ -type f
:find
položky v adresářiA/
jehož typem je soubor (místo adresáře)…-maxdepth 1 -name '.*'
:K tomu promaxdepth
z 1 adresářů a jejichžname
začíná.
.-exec cp -p {} B/ \;
:A jakmile jsou tyto soubory nalezeny,exec
cp
příkaz s-p
příznak pro zachování dat/časů ze zdroje ({}
) do cíleB/
.
Rád používám maxdepth
přidat vrstvu kontroly, abych náhodou nekopíroval celý souborový systém. Ale klidně to odstraňte.