¿Cómo puedo copiar archivos con nombres de archivo duplicados en un directorio y retener ambos archivos haciendo que los duplicados cambien de nombre automáticamente?

11

En el sistema operativo Windows, cuando copia un archivo en un directorio que ya tiene un archivo con ese nombre, le pregunta si desea:

  1. copiar el archivo y reemplazar / sobrescribir el existente
  2. cancelar la copia del nuevo archivo en el directorio
  3. copie el archivo, pero cámbiele el nombre (como algo así como "nombre de archivo - copia (1)")

Cuando hago esto en Ubuntu, no tengo esa tercera opción (que muchas veces es una opción muy útil). ¿Hay alguna manera de poder hacer eso en Ubuntu?

Heisenbergman
fuente

Respuestas:

17

Lamentablemente, Nautilus no tiene esa opción.

Opción 1: un administrador de archivos diferente

Podrías probar con otro administrador de archivos como Dolphin .

Instalar Dolphin(requiere el repositorio del universo )

Opción 2: línea de comando

También puede usar el programa de línea de comandos cp(1)con la opción de copia de seguridad:

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

Esto tiene los siguientes efectos que se pueden controlar con otras opciones como se describe en la página del manual de cp(1):

--backup[=CONTROL] - haga una copia de seguridad de cada archivo de destino existente

-b- me gusta --backuppero no acepta una discusión

-S, --suffix=SUFFIX- anular el sufijo de copia de seguridad habitual

El sufijo de copia de seguridad es ~, a menos que se establezca con --suffixo SIMPLE_BACKUP_SUFFIX. El método de control de versión se puede seleccionar mediante la --backupopción o mediante la VERSION_CONTROLvariable de entorno. Aquí están los valores:

  • none, off: nunca haga copias de seguridad (incluso si --backupse da)
  • numbered, t: hacer copias de seguridad numeradas
  • existing, nil: numerado si existen copias de seguridad numeradas, de lo contrario, simple
  • simple, never: siempre haga copias de seguridad simples

Ejemplo

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

Esto copiará todos los archivos ~/Musica ~/Videos. Si existe un archivo con el mismo nombre en el destino, se renombra agregando .origa su nombre como copia de seguridad. Si existe un archivo con el mismo nombre que la copia de seguridad, se cambiará el nombre de la copia de seguridad agregando .1y si eso existe también, .2etc. Solo entonces se copia el archivo de origen en el destino.

Si desea copiar archivos en subdirectorios use recursivamente:

cp -R --backup=existing --suffix=.orig -t ~/Videos ~/Music
David Foerster
fuente
Gracias por la sugerencia de usar un administrador de archivos diferente. Desafortunadamente, Thunar tampoco tiene la opción a la que me refiero. Solo tiene: Cancelar, Saltar todo, Saltar, Reemplazar, Reemplazar todo. Probaré Dolphin.
Heisenbergman
1
Dolphin funciona muy bien para esto :)
heisenbergman
Gracias por probar los dos. Actualizaré mi pregunta de acuerdo con sus hallazgos.
David Foerster
@heisenbergman, Hola, ¿qué quisiste decir con Dolphin que funciona muy bien para esto? Ofrece la opción de cambiar el nombre, pero aún así solo me permite cambiar el nombre de los archivos uno por uno. Lamentablemente, la opción "aplicar a todos" no se puede utilizar con la opción de cambiar el nombre. Esto es bastante inútil para una gran cantidad de archivos. ¿Es solo mi versión? ¿Se las arregló para cambiar el nombre de todos sus dobles a la vez (como puede hacerlo en Windows), usando Dolphin?
Kvothe
2

Encontré esto en superusuario :

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

El archivo que tiene el mismo nombre se renombra al archivo con el md5sum agregado al nombre. Si lo guarda en un nombre de archivo como "saveCopy", puede usarlo findasí para ejecutarlo:

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

Para más información sobre esto, vea el enlace.

Rinzwind
fuente
0

Copie este script en el directorio superior, hágalo ejecutable y ejecútelo:

#!/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
fuente