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 suffixZáložní přípona je
~, pokud není nastaveno na--suffixneboSIMPLE_BACKUP_SUFFIX. Metodu správy verzí lze vybrat pomocí--backupnebo pomocíVERSION_CONTROLproměnná prostředí. Zde jsou hodnoty:
none,off:nikdy neprovádějte zálohy (i když--backupje dáno)numbered,t:provádějte číslované zálohyexisting,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;-)