GNU/Linux >> Znalost Linux >  >> Linux

Kopírování všech souborů uvnitř podadresářů a přejmenování místo přepisování

GNU cp(1) má možnost zálohování:

cp --backup SOURCE [SOURCE...] [DESTINATION]

To má následující efekty, které lze ovládat dalšími možnostmi, jak je popsáno v manuálové stránce cp(1) :

--backup[=CONTROL]
          make a backup of each existing destination file

-b     like --backup but does not accept an argument

-S, --suffix=SUFFIX
          override the usual backup suffix

Záložní přípona je ~ , pokud není nastaveno na --suffix neboSIMPLE_BACKUP_SUFFIX . Metodu správy verzí lze vybrat pomocí --backup nebo pomocí VERSION_CONTROL proměnná prostředí. Zde jsou hodnoty:

  • none , off :nikdy neprovádějte zálohy (i když --backup je dáno)
  • numbered , t :provádějte číslované zálohy
  • existing , nil :očíslované, pokud existují číslované zálohy, jinak jednoduché
  • simple , never :vždy provádějte jednoduché zálohy

Příklad

cp --backup=existing --suffix=.orig ~/Music/* ~/Videos

Tím se zkopírují všechny soubory ve formátu ~/Music na ~/Videos . Pokud v cíli existuje soubor se stejným názvem, přejmenuje se přidáním .orig k jeho názvu jako záloha. Pokud existuje soubor se stejným názvem jako záloha, záloha se místo toho přejmenuje přidáním .1 a pokud existuje také, .2 a tak dále. Teprve poté je zdrojový soubor zkopírován do cíle.

Pokud chcete kopírovat soubory v podadresářích rekurzivně, použijte -R :

cp -R --backup=existing --suffix=.orig ~/Music ~/Videos

Váš problém je ve skutečnosti najít cp varianta, která vytvoří cílový soubor pod jiným názvem, pokud již existuje. Neznám žádný nástroj, který by to dělal, nicméně není těžké to sami implementovat:

cp -vn "$1" "$2"/ || cp -vn "$1" "$2"/"${1##*/}"~"$(md5sum "$1" | cut -f1 -d' ')"

Tento skript volá cp znovu v případě, že selže, připojení kontrolního součtu k názvu souboru. Chyba:Pokud se zobrazí třetí soubor se stejným názvem, přepíše druhý soubor pokud jsou totožné .

Vzhledem k tomu, že výše uvedený skript se nazývá saveCopy a uloženy v nadřazeném pracovním adresáři, funguje následující:

$ find . -name 'z*.jpg' -exec ./saveCopy {} /tmp/Extracted/ \;
./a/z1.jpg -> /tmp/Extracted/z1.jpg
./a/z2.jpg -> /tmp/Extracted/z2.jpg
./a/z3.jpg -> /tmp/Extracted/z3.jpg
/tmp/Extracted/z3.jpg not overwritten
./b/z3.jpg -> /tmp/Extracted//z3.jpg~d41d8cd98f00b204e9800998ecf8427e
./b/z4.jpg -> /tmp/Extracted/z4.jpg

Uvědomte si, že skript funguje pouze pro jeden vstupní soubor a pokud je cílem adresář! Určitě se to dá vylepšit;-)


Linux
  1. Jak spočítat počet souborů a podadresářů v daném adresáři

  2. Přejmenujte všechny soubory a názvy adresářů na malá písmena v Linuxu

  3. Shell Script:Třídění souborů do adresářů a podadresářů?

  1. Jak rekurzivně vypsat všechny soubory a adresáře

  2. Odstraňte odpovídající soubory ve všech podadresářích

  3. Kopírování uživatelů a hesel Linuxu na nový server

  1. Jak zjistit počet souborů v adresáři a podadresářích

  2. Jak v Linuxu přejmenuji všechny složky a soubory na malá písmena?

  3. Dávkové přejmenování souborů v příkazovém řádku a Xargs