GNU/Linux >> Tutoriels Linux >  >> Linux

Copier tous les fichiers dans les sous-répertoires et les renommer au lieu de les écraser

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'option VERSION_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ées
  • existing , nil :numéroté si des sauvegardes numérotées existent, simple sinon
  • simple , 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;-)


Linux
  1. Comment compter le nombre de fichiers et de sous-répertoires dans un répertoire donné

  2. Comment trouver le nombre de fichiers dans un répertoire et des sous-répertoires

  3. Renommer tous les fichiers et noms de répertoires en minuscules sous Linux

  4. Script Shell :trier les fichiers dans des répertoires et des sous-répertoires ?

  5. Comment renommer tous les dossiers et fichiers en minuscules sous Linux ?

Stéganographie - Masquer les fichiers à l'intérieur des images sous Linux

Comment effectuer une recherche Grep sur tous les fichiers et dans tous les répertoires

Linux :rechercher le nombre de fichiers dans un répertoire et des sous-répertoires

Comment grep une chaîne dans un répertoire et tous ses sous-répertoires ?

Supprimer les fichiers correspondants dans tous les sous-répertoires

Comment déplacer tous les fichiers et dossiers via la commande mv