Řešení 1:
Téměř pokaždé to lze vyřešit pomocí:
cp -R .[a-zA-Z0-9]* directory
Je docela neobvyklé mít skrytý soubor, který nezačíná jedním z těchto znaků.
K dispozici jsou další shody vzorů (.??*
, .[^.]*
) - viz komentáře
Řešení 2:
Můj oblíbený přesun dirs obecně byl:
tar cvf - . | (cd /dest/dir; tar xvf -)
který taruje aktuální adresář na stdout, pak jej převádí do podshell, který první cd je do cílového adresáře, než zruší tarring stdin. Jednoduché, přímé, rozšiřitelné - zvažte, co se stane, když nahradíte () ssh na jiný počítač. Nebo jako odpověď na vaši otázku můžete udělat:
tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)
Řešení 3:
Můžete použít rsync
.
rsync -a ./ /some/other/directory/
který zkopíruje obsah aktuálního adresáře (včetně tečkových souborů, ale ne včetně ..
)
Řešení 4:
Prosím vás, ustupte od prosté expanze shellu na cp
příkazový řádek - rozšíření shellu má všechny druhy ehm "zajímavá" rohová pouzdra (nežádoucí rekurze způsobená . a .., mezery, netisknutelné položky, pevné odkazy, symbolické odkazy atd.) Použijte find
místo toho (dochází v findutils
balíček, v případě, že jej nemáte nainstalovaný – což by bylo divné, všechny distribuce jej instalují standardně):
find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;
Vysvětlení krok za krokem:
-H
způsobífind
nenásledovat symbolické odkazy (kromě případů, kdy skutečný název adresáře nejvyšší úrovně, který jste mu dali, je symbolický odkaz; bude následovat.)/path/to/toplevel/dir/
je, samozřejmě, měl být vámi nahrazen cestou do adresáře, který hostí soubory nastavení a adresáře, které chcete zálohovat.-maxdepth 1
zastavífind
z rekurzivního sestupu do všech adresářů, jejichž název začíná tečkou. Nepotřebujeme to k rekurzi,cp
udělá to za nás, potřebujeme jen jména na této úrovni.-name '.*'
říkáfind
že chceme všechna jména začínající tečkou. Toto nebude fungovat správně, pokud je proměnná prostředíPOSIXLY_CORRECT
je nastaven, ale zřídka (pokud vůbec) je. Toto je první podmínka shody, kterou jsme zatím specifikovali.a \( ....... \)
je a následuje složitější podmínka v závorkách (použil jsem ..... k jejímu nahrazení, je to vysvětleno níže.) Musíme závorky opustit, protože jinak by byly (nesprávně) interpretovány shellem, proto zpětné lomítko před nimi,-type d -o -type f -o -type l
jsou tři podmínky s nebo mezi nimi.-type d
odpovídá adresářům,-type f
odpovídá běžným souborům a-type l
odpovídá symbolickým odkazům. Můžete si vybrat, co chcete – pokud například nechcete zálohovat adresáře nastavení, vynechejte-type d
(a-o
hned za tím, samozřejmě.)-exec ..... \;
říkáfind
provést příkaz pokaždé, když je nalezena shoda. Konec příkazu je označen středníkem, který opět musíme ukončit zpětným lomítkem, abychom se vyhnuli interpretaci shellu. V tomto příkazovém řádku musíte použít{}
kde chcete, aby skončil název aktuálně nalezené shody. Protože shelly mohou také nesprávně interpretovat složené závorky, měli byste je umístit do apostrofů, jako v'{}'
. Příkaz, který chceme v tomto případě provést, jecp -a '{}' /path/to/destination/dir/
(-a znamená archiv, který se opakuje v podadresářích, kopíruje symbolické odkazy jako odkazy a zachovává oprávnění a rozšířené atributy a/path/to/destination/dir/
je zjevně název cílového adresáře – nahraďte jej.)
Takže, v jednoduché angličtině, toto find
příkazový řádek říká toto:
Začněte na /path/to/toplevel/dir/. Nesestupujte do žádných podadresářů. Najděte všechny adresáře, soubory a symbolické odkazy, jejichž název začíná tečkou. U každého z těch, které jste našli, zkopírujte do /cesta/k/cíl/adresář/, přičemž zachováte povahu, oprávnění a rozšířené atributy.
Řešení 5:
Vždy jsem používal .??* k nalezení skrytých souborů, aniž bych dostal "." a "..". Může v něm chybět „.a“ nebo tak něco, ale já nikdy žádné takové nemám.