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émumv
.
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.
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.