GNU/Linux >> Znalost Linux >  >> Linux

Rekurzivní kopírování skrytých souborů - Linux

Ř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, je cp -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.


Linux
  1. Skryjte skryté soubory Linuxu ve Windows

  2. Rekurzivně přejmenovávat soubory (změnit příponu) v Linuxu

  3. Jak chmodovat a chown skryté soubory v Linuxu?

  1. Jak najít soubor v Linuxu ve všech adresářích rekurzivně

  2. Rekurzivní počítání souborů v adresáři Linuxu

  3. Rychlý způsob rekurzivního počítání souborů v linuxu

  1. Kopírování souborů na základě data modifikace v Linuxu

  2. používat SED rekurzivně v linuxu?

  3. Kopírování uživatelů a hesel Linuxu na nový server