GNU/Linux >> Znalost Linux >  >> Linux

Sloučení složek s Mv?

Pokud použiji mv přesunout složku s názvem „složka“ do adresáře, který již obsahuje „složku“, sloučí se nebo bude nahrazena?

Přijatá odpověď:

mv nelze sloučit nebo přepsat adresáře, selže se zprávou “mv:nelze přesunout ‚a‘ do ‚b‘:Adresář není prázdný“ , i když používáte --force možnost.

Můžete to obejít pomocí jiných nástrojů (jako rsync , find , nebo dokonce cp ), ale musíte pečlivě zvážit důsledky:

  • rsync může sloučit obsah jednoho adresáře do jiného (ideálně pomocí --remove-source-files možnost bezpečně odstranit pouze ty zdrojové soubory, které byly úspěšně přeneseny, a s obvyklou možností oprávnění/vlastnictví/uchování času -a pokud si přejete)
    ale toto je operace úplného kopírování, a proto může být velmi náročná na disk.
  • Aktuálně preferovaná možnost: Můžete kombinovat rsync ‘s --link-dest=DIR možnost (kde je to možné vytvořit pevné odkazy místo kopírování obsahu souboru) a --remove-source-files získat sémantiku velmi podobnou běžnému mv .
    Za tímto účelem --link-dest je třeba zadat absolutní cestu ke zdroji adresář (nebo relativní cesta z cíle do zdroje ).
    ale toto používá --link-dest nezamýšleným způsobem (což může, ale nemusí způsobit komplikace), vyžaduje znát (nebo určit) absolutní cestu ke zdroji (jako argument pro --link-dest ) a opět ponechá prázdnou adresářovou strukturu, která se má vyčistit podle .
  • Můžete použít find postupně znovu vytvořit strukturu zdrojového adresáře v cíli a poté jednotlivě přesunout skutečné soubory
    ale to se musí opakovat přes zdroj vícekrát a může nastat závody (nové adresáře jsou vytvářeny u zdroje během vícekrokového procesu)
  • cp může vytvářet pevné odkazy (zjednodušeně řečeno další ukazatele na stejný existující soubor), což vytváří výsledek velmi podobný sloučení mv (a je velmi IO-efektivní, protože se vytvářejí pouze ukazatele a žádná skutečná data se nemusí kopírovat)
    ale to opět trpí možným sporem (nové soubory ve zdroji jsou smazány, i když nebyly zkopírovány v předchozím kroku)

Které z těchto řešení (pokud nějaké) je vhodné, bude velmi záviset na vašem konkrétním případu použití.
Jako vždy si před provedením kteréhokoli z těchto příkazů rozmyslete a mějte zálohy.

Související:Jak stahovat složky větší než 20 GB na Dropbox bez účtu Pro?

1:Všimněte si, že rsync --remove-source-files nesmaže žádné adresáře, takže budete muset udělat něco jako find -depth -type d -empty -delete poté, abyste se zbavili prázdného stromu zdrojového adresáře.


Linux
  1. Spuštění skriptu s „. “ A se „zdrojem“?

  2. Cat soubory s adresářem?

  3. Kontrola velikosti adresáře pomocí příkazu du v systému Linux

  1. Sloučit 3 po sobě jdoucí řádky s výměnou?

  2. Zachovat datum změny v adresářích/složkách pomocí Rsync?

  3. Jak na to:Programování v C s adresáři na Linuxu

  1. Použití –exclude With The Du Command?

  2. Makefiles se zdrojovými soubory v různých adresářích

  3. nemůže zdrojový skript v aktuálním adresáři