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:
rsyncmůže sloučit obsah jednoho adresáře do jiného (ideálně pomocí--remove-source-filesmož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-apokud 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=DIRmožnost (kde je to možné vytvořit pevné odkazy místo kopírování obsahu souboru) a--remove-source-fileszískat sémantiku velmi podobnou běžnémumv.
Za tímto účelem--link-destje třeba zadat absolutní cestu ke zdroji adresář (nebo relativní cesta z cíle do zdroje ).
… ale toto používá--link-destnezamýš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
findpostupně 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) cpmůž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.
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.