GNU cp(1)
a une option de sauvegarde :
cp --backup SOURCE [SOURCE...] [DESTINATION]
Cela a les effets suivants qui peuvent être contrôlés avec d'autres options comme décrit dans la page de manuel de 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
Le suffixe de sauvegarde est
~
, sauf si défini avec--suffix
ouSIMPLE_BACKUP_SUFFIX
. La méthode de contrôle de version peut être sélectionnée via le--backup
ou via l'optionVERSION_CONTROL
variable d'environnement. Voici les valeurs :
none
,off
:ne jamais faire de sauvegardes (même si--backup
est donné)numbered
,t
:faire des sauvegardes numérotéesexisting
,nil
:numéroté si des sauvegardes numérotées existent, simple sinonsimple
,never
:faites toujours des sauvegardes simples
Exemple
cp --backup=existing --suffix=.orig ~/Music/* ~/Videos
Cela copiera tous les fichiers dans ~/Music
à ~/Videos
. Si un fichier du même nom existe à la destination, il est renommé en ajoutant .orig
à son nom en tant que sauvegarde. Si un fichier portant le même nom que la sauvegarde existe, la sauvegarde est renommée à la place en ajoutant .1
et, si cela existe aussi, .2
et ainsi de suite. Ce n'est qu'alors que le fichier source est copié vers la destination.
Si vous souhaitez copier des fichiers dans des sous-répertoires de manière récursive, utilisez -R
:
cp -R --backup=existing --suffix=.orig ~/Music ~/Videos
Votre problème est en fait de trouver un cp
variante qui crée le fichier cible sous un autre nom s'il existe déjà. Je ne connais pas d'outil qui le fasse, cependant, ce n'est pas difficile à mettre en œuvre vous-même :
cp -vn "$1" "$2"/ || cp -vn "$1" "$2"/"${1##*/}"~"$(md5sum "$1" | cut -f1 -d' ')"
Ce script appelle cp
à nouveau en cas d'échec, en ajoutant la somme de contrôle au nom de fichier. Défaut :Si un troisième fichier portant le même nom apparaît, il écrasera le deuxième fichier s'ils sont identiques .
Étant donné que le script ci-dessus s'appelle saveCopy
et stockés dans le répertoire de travail parent, les travaux suivants :
$ 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
Sachez que le script ne fonctionne que pour un seul fichier d'entrée et si la cible est un répertoire ! C'est certainement perfectible;-)