GNU/Linux >> Znalost Linux >  >> Linux

Proč se mv nemůže vypořádat s existencí stejnojmenného adresáře v cíli?

mv a rsync nejsou podobné programy. Konkrétně mv se často pokouší jednoduše přejmenovat objekty. Pokud je ve stejném souborovém systému, nekopíruje obsah vůbec.

Pokud jste ještě neměli imperative_PLs/fortran a poté mv by trvalo stávající fortran adresář a přejmenujte jej na tento bod ve stromu.

Ale v tomto umístění již máte adresář (s obsahem). Protože název může odkazovat pouze na jeden objekt, existující adresář by musel být buď odstraněn, nebo přejmenován. mv předpokládá, že nechcete dělat ani jedno, a přeruší se.

rsync místo toho zkopíruje jednotlivé soubory a další obsah uvnitř fortran a vloží je do existujícího imperative_PLs/fortran adresář.

Představte si to jako rename místo toho a chování se může zdát srozumitelnější.


mv je ve skutečnosti rename pod krytem.

Pokud přesunete soubor do jiného souboru, mv předpokládá, že víte, co děláte, a přepíšete cílový soubor.

Pokud přesunete adresář do jiného adresáře, mv předpokládá, že chcete zachovat základní název vašeho původního adresáře a vytvořit jej v cílovém adresáři. Pokud na cílové straně ještě není adresář s tímto názvem nebo pokud adresář s tímto názvem existuje, ale je prázdný, operace bude úspěšná.

Pokud však cílový adresář již existuje a není prázdný, není to již rename ale to by mělo být rekurzivní odstranění souborů a adresářů. rename není navržen tak, aby to dělal, takže selže, mv nejde dále, protože předpokládá, že jste to nechtěli udělat, a také selže.


  1. mv v tomto případě nefunguje, protože k tomu není navržen. Systémová volání jsou (pravděpodobně) buď

    • Přesunout do stejného souborového systému:rename (původně link a unlink )
    • Přesun mezi systémy souborů:rekurzivní kopírování souboru následované rekurzivním unlink
  2. Názor:Myslím, že to není tak moc, že ​​to bylo navrženo ne fungovat, protože nebyl navržen tak, aby zvládl tento případ použití. Pro „jednoduchý“ nástroj, který má dělat jednu věc dobře, budete muset poskytnout sadu přepínačů, které označí mv kterou z těchto akčních cest se vydat:

    • K kauci s chybou, jako v aktuální implementaci
    • Chcete-li sloučit, kauce s chybou, pokud soubor již existuje
    • Chcete-li sloučit, nahraďte všechny cílové soubory, které již existují

Pokud je akce sloučení/nahrazení tím, co chcete, můžete ji dostatečně snadno implementovat pomocí cp následuje rm , nebo pomocí jednoho z obslužných programů pro kopírování stromu souborů tar , pax , atd.


Linux
  1. Proč může Rm odebrat soubory pouze pro čtení?

  2. Cat soubory s adresářem?

  3. Sloučení složek s Mv?

  1. Můžete použít kotvy ^ $ s Ls?

  2. Proč se příkaz Ls pomalu přerušuje v adresáři Nfs se spoustou souborů?

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

  1. Proč je to Rm -rf a ne Rmdir -rf?

  2. Jak mohu gunzip do jiného cílového adresáře?

  3. Proč musí být složka spustitelná?