Má mv
fungovat jako cp(1)
pokud povolení procesu přesunout odepřeno?
Pokud ano, není to proti pravidlu dělat jednu věc a dělat to dobře?
Přijatá odpověď:
Krátká odpověď je, že ne.
mv
je definován jako:
provádět akce ekvivalentní
rename()
funkce
rename()
nekopíruje obsah, pouze jej přejmenuje na disku. Je to zcela atomová operace, která nikdy neselže částečně dokončená.
To však nevypovídá celý příběh. Kam tento efekt může se stane, když se pokoušíte přesunout soubor mezi zařízeními:v takovém případě není možné provést přejmenování v souborovém systému. Chcete-li mít efekt přesunutí, mv
nejprve zkopíruje zdroj do cíle a poté zdroj odstraní. Ve skutečnosti mv /mnt/a/X /mnt/b/Y
je v podstatě ekvivalentní cp /mnt/a/X /mnt/b/Y && rm /mnt/a/X
. Jedině tak může fungovat přesouvání souborů mezi zařízeními.
Když mv
nemá oprávnění smazat tento zdrojový soubor, bude hlášena chyba, ale v tom okamžiku již ke kopírování došlo. Tomu se nelze vyhnout kontrolou oprávnění předem kvůli možným závodním podmínkám, kdy se oprávnění během operace mění.
Neexistuje žádný způsob, jak zabránit této možné eventualitě, kromě znemožnění přesunu souborů mezi zařízeními. Volba povolit mv
mezi jakýmkoli zdrojem a cílem dělá věci v obecném případě jednodušší, na úkor zvláštního (ale nedestruktivního) chování v těchto neobvyklých případech.
To je také důvod, proč je přesun velkého souboru v rámci jednoho zařízení mnohem rychlejší než přesunutí do jiného.