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á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;-)