Comment puis-je copier des fichiers avec des noms de fichiers en double dans un répertoire et conserver les deux fichiers en faisant renommer automatiquement les doublons?

11

Sous Windows OS, lorsque vous copiez un fichier dans un répertoire qui contient déjà un fichier portant ce nom, il vous demande si vous souhaitez:

  1. copier le fichier et remplacer / écraser celui existant
  2. annuler la copie du nouveau fichier dans le répertoire
  3. copiez le fichier, mais renommez-le (comme quelque chose comme "filename - copy (1)")

Quand je fais cela dans Ubuntu, je n'ai pas cette 3ème option (qui est souvent une option très utile). Existe-t-il un moyen de le faire dans Ubuntu?

heisenbergman
la source

Réponses:

17

Nautilus n'a malheureusement pas cette option.

Option 1: un gestionnaire de fichiers différent

Vous pouvez essayer un autre gestionnaire de fichiers comme Dolphin .

Installer Dolphin(nécessite le dépôt Universe )

Option 2: ligne de commande

Vous pouvez également utiliser le programme de ligne de commande cp(1)avec l'option de sauvegarde:

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

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] - faire une sauvegarde de chaque fichier de destination existant

-b- aime --backupmais n'accepte pas un argument

-S, --suffix=SUFFIX- remplacer le suffixe de sauvegarde habituel

Le suffixe de sauvegarde est ~, sauf s'il est défini avec --suffixou SIMPLE_BACKUP_SUFFIX. La méthode de contrôle de version peut être sélectionnée via l' --backupoption ou via la VERSION_CONTROLvariable d'environnement. Voici les valeurs:

  • none, off: ne faites jamais de sauvegardes (même si elles --backupsont fournies)
  • numbered, t: effectuer des sauvegardes numérotées
  • existing, nil: numéroté s'il existe des sauvegardes numérotées, simple sinon
  • simple, never: faites toujours des sauvegardes simples

Exemple

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

Cela va copier tous les fichiers ~/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 .1et si cela existe également .2, etc. 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, utilisez récursivement:

cp -R --backup=existing --suffix=.orig -t ~/Videos ~/Music
David Foerster
la source
Merci pour la suggestion d'utiliser un autre gestionnaire de fichiers. Malheureusement, Thunar n'a pas non plus l'option à laquelle je fais référence. Il a juste: Annuler, Ignorer tout, Ignorer, Remplacer, Remplacer tout. Va essayer Dolphin.
heisenbergman
1
Dolphin fonctionne très bien pour cela :)
heisenbergman
Merci d'avoir essayé les deux. Je mettrai à jour ma question en fonction de vos résultats.
David Foerster
@heisenbergman, Salut, que vouliez-vous dire par Dolphin fonctionne très bien pour cela? Il offre la possibilité de renommer, mais il me permet toujours de renommer les fichiers un par un. Malheureusement, l'option "appliquer à tous" ne peut pas être utilisée avec l'option à renommer. Ceci est tout à fait inutile pour une grande quantité de fichiers. Est-ce juste ma version? Avez-vous réussi à renommer tous vos doubles à la fois (comme vous pouvez le faire sous Windows), en utilisant Dolphin?
Kvothe
2

Trouvé ceci sur le superutilisateur :

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

Le fichier portant le même nom est renommé en fichier avec la somme md5 ajoutée au nom. Si vous l'enregistrez dans un nom de fichier comme "saveCopy", vous pouvez utiliser findcomme ceci pour l'exécuter:

find . -name 'z*.jpg' -exec ./saveCopy {} /tmp/Extracted/ \;

Pour en savoir plus, voir le lien.

Rinzwind
la source
0

Copiez ce script dans le répertoire supérieur, rendez-le exécutable et exécutez-le:

#!/bin/bash

## Get a list of all files
list=$(find . -mindepth 2 -type f -print)
nr=1

## Move all files that are unique
find . -mindepth 2 -type f -print0 | while IFS= read -r -d '' file; do
    mv -n $file ./
done
list=$(find . -mindepth 2 -type f -print)

## Checking which files need to be renamed
while [[ $list != '' ]] ; do
   ##Remaming the un-moved files to unique names and move the renamed files
   find . -mindepth 2 -type f -print0 | while IFS= read -r -d '' file; do
       current_file=$(basename $file)
       mv -n $file "./${nr}${current_file}"
   done
   ## Incrementing counter to prefix to file name
   nr=$((nr+1))
   list=$(find . -mindepth 2 -type f -print)
done
warhansen
la source