it-swarm-eu.dev

Proč unixový mv program nepotřebuje -R (rekurzivní) volbu pro adresáře, ale cp to potřebuje?

Vždy, když je potřeba použít cp nebo mv, dostanu se do pořádku: "Potřebuji -R možnost při práci s dir? "V GNU coreutils cp potřebuje -R a mv ne.

Nemohu najít žádný důvod, proč cp potřebuje -R možnost pro kopírování adresářů a mv ne. Myslím, že cp ing dires bez -R (ale chová se rekurzivně, jako by to bylo -R a podobně jako mv) by nezpůsobil žádné problémy kromě rozbití něčího zvyku při používání nástroje.

Znáte nějaké vysvětlení? Může to mít důvod už dávno?


Další otázka: Proč vývojáři coreutils ve výchozím nastavení rekurzivně nekopírují cp dirs?

59
rslnx

Adresář je (koncepčně) zvláštní „soubor“, který obsahuje seznam jmen a čísla inodů, na která tyto názvy odkazují. Některá jména mohou být podadresáře. Existuje zvláštní položka .., Která odkazuje na nadřazený adresář.

Je tedy jasné, že změna názvu souboru je snadná: stačí změnit název v položce adresáře, nic jiného. To platí, zda je soubor skutečně souborem, nebo jde o „soubor“ používaný k uložení obsahu jiného adresáře. Opravdu, stejné rename syscall dělá obojí.

Kopírování je však mnohem méně triviální. Ty mohl zkopírovat adresář "file", ale pak bys měl dva adresáře, kde jsou soubory stejné (byly by to hardlinks). Pokud byste měli systém, který umožňuje pevné odkazy na adresáře, měly by to být, ale protože žádný moderní systém to neumožňuje, alespoň pro uživatele bez oprávnění root, musíte tuto kopii udělat pro každý podadresář. Ve skutečnosti můžete požádat cp o toto chování pomocí cp -lR: -l Pro pevný odkaz, -R Pro tuto rekurzi.

Ale ponechat vše propojené pravděpodobně není to, co chcete. Místo toho chcete cp zkopírovat každý soubor. To je docela drahá operace: každý soubor musí být načten do paměti a zapsán zpět na disk na druhém místě. Otevření, čtení, zápis a zavření souborů vyžaduje několik systémových volání, což je nutné opakovat pro každý soubor.

Tradiční souborové systémy fungují také na disku. Neexistuje žádný způsob, jak kopírovat spoustu souborů, než procházet každý jednotlivě a kopírovat je, a to jsou typy souborových systémů, které byly používány při navrhování základních nástrojů příkazového řádku.

45
derobert

Dovolte mi začít položením další otázky:

Jaký je rozdíl mezi cp a cp -R?

No, bez příznaku -R Je možné kopírovat pouze soubory, protože je poměrně neobvyklé, že někdo chce nere rekurzivně zkopírovat adresář: Nere rekurzivní kopie by měla za následek pouze druhé jméno adresáře, směřující přímo na stejnou strukturu adresářů. Protože to lidé zřídka chtějí a ve skutečnosti existuje samostatný program, který to dělá (ln), není povolena nere rekurzivní kopie adresářů.

Jaký by tedy mohl být rozdíl mezi mv a mv -R?

mv a b Jen přejmenuje jednu položku v adresáři, takže pokud je adresář mved, jeho obsah se automaticky také přesune. V tomto smyslu mv již poskytuje rekurzivní vlastnost, tj. „Přejmenování“ všech položek v přejmenovaném adresáři, např. od a/1 do b/1. mv, který to nedělá, tj. Který přejmenuje adresář a na b, ale udržuje a/1 Jako a/1, Není co lidé rozumějí, když odkazují na něco, co se pohybuje: Když přemísťujete skříň, přesune se také obsah skříně. Tato další operace, přesunutí adresáře bez jeho obsahu, je již k dispozici, nazývá se mkdir.

21
daniel kullmann

Obvykle, když jsem zmatený s logikou Unixu, podívám se na Plan9, abych viděl, jak Unixoví vynálezci implementovali stejné úkoly o několik let později, aniž by se uchytili zpětné kompatibility.

Plan9 proto nabízí nástroje cp a mv pro práci pouze se soubory.

`cp f1 f2` creates f2 and copies f1's contents into it.
`mv f1 f2` renames f1 to f2 if f1 and f2 are in the same dir
           does `cp f1 f2 && rm f1` else
           can rename dirs (`mv d1 d2`) but will not move dir to another dir.

Pro kopírování dir je dircp to je opravdu @{cd fromdir && tar c .} | @{cd todir && tar xT} (rc Syntaxe prostředí)

Pro přemístění dir si myslím, že existuje pouze dircp d1 d2 && rm -r d1

Domnívám se, že toto rozhodnutí omezit cp a mv pouze pro operace se soubory (nikoli pro soubory) přináší větší přehlednost pro operace s diskem a použití tar pro kopírování stromů souborů je pro porozumění velmi pohodlné a skriptování.

6
rslnx