Copiar archivos con cambio de nombre

28

Tengo un gran árbol de archivos. Algunos archivos tienen el mismo nombre pero en diferentes casos, por ejemplo, some_code.cy Some_Code.c.

Entonces, cuando intento copiarlo a un sistema de archivos NTFS / FAT, me pregunta si quiero reemplazarlo o omitirlo.

¿Hay alguna forma de cambiar automáticamente el nombre de dichos archivos, por ejemplo, agregando  (1)al nombre del archivo de conflicto (como lo hace Windows 7)?

Alexander Dzyoba
fuente
Curioso. Solo quería ver qué tipo de error obtengo si intento producir un archivo con el mismo nombre en una partición NTFS (HPFS / NTFS, según sudo fdisk -l /dev/sda), y lo hice touch foo; touch Fooy terminé con 2 archivos fooy Foo. Pero no tengo curiosidad de reiniciar en Windows, para ver cómo se ven allí. ¿Migrar es solo un problema de FAT? Ah, tengo una memoria USB con FAT y podría crear un sistema FAT dentro de un archivo ... ... un momento, por favor. :)
usuario desconocido

Respuestas:

41

Muchas herramientas de GNU como cp, mvy taradmiten la creación de archivos de copia de seguridad cuando existe el objetivo. Es decir, cuando se copia fooa barsi ya existe un archivo llamado bar, el existente bar pasará a llamarse, y después de la copia barcontendrá el contenido de foo. Por defecto, barse renombra a bar~, pero el comportamiento se puede modificar:

                                # If a file foo exists in the target, then…
cp -r --backup source target    #   rename foo → foo~
cp -r --backup=t source target  #   rename foo → foo.~1~ (or foo.~2~, etc)

Existen otras variantes, como crear copias de seguridad numeradas solo cuando ya existe una. Consulte el manual de coreutils para más detalles.

Gilles 'SO- deja de ser malvado'
fuente
1
Brillante. No sabía que esta opción existía, y simplemente resultó ser extremadamente útil. Gracias @Gilles.
Steve Hill
2
OSX cp no tiene un indicador de copia de seguridad. use brew install coreutilsy luego use el comando en su gcplugar.
Weston Ganger
6

Lo intenté

apropos copy | grep "(1)" 

para encontrar posibles candidatos, y apareció la copia.

man mcopy 

muestra una opción prometedora, -D clash-option¿no es genial? Pero no es tan genial, no se describe. Pero hay algunos consejos para mtools.dvi, que busqué en mi sistema, sin éxito, y a través de google, sin éxito, pero luego, con google, busqué directamente mcopy clash-optiony encontré este sitio .

Hice una prueba corta

mcopy -D A f* a 

a las pruebas de autorename y targetdir a: en lugar de autorenaming, me pidió que ignorara o anulara cada archivo, ese estúpido s ....

Mi versión es mtools-4.0.10y la página de ayuda es de 1996 - 15 años. ¿Deberíamos realmente perder algunas características, mientras tanto?

Yo dividiría el trabajo en dos pasos:

  • Realice una función corta, que genera un nombre único para un archivo, si ese nombre está ocupado.
  • Ejecute findy ejecute ese script para cada archivo que desee copiar.

¿Ayudamos en este enfoque? :)

Aquí hay una secuencia de comandos, para autodenominar archivos:

#!/bin/bash

name=$1
target=$2

autorename () {
name=$1
target=$2
no=$3 

test -e ${target}/${name}.$no && autorename ${name} ${target} $((no+1)) || cp ${name} ${target}/${name}.$no 

}

test -e ${target}/${name} && autorename ${name} ${target} 0 || cp ${name} ${target} 

y esta es mi invocación de prueba:

find -maxdepth 1 -name "fo*" -type f -exec ./autorename.sh {} /mnt/hidden/test/a ";"

Nota: -maxdepth, -name y -type donde se usa para restringir dramáticamente el número de archivos afectados. No probé el script para estructuras de archivos más profundas, ni para espacios en blanco en los nombres de archivo y otros caracteres funky como salto de línea, salto de página, etc.

Solía ​​.1 porque no causa problemas en la mayoría de los comandos, mientras que a (y a) a menudo necesitan enmascararse.

usuario desconocido
fuente
0

No con GNU cp, al menos.

Se recomienda encarecidamente que no tenga nombres de archivo duplicados (ignorando las mayúsculas y minúsculas), solo le causarán un mundo de dolor. Encuentre una lista de tales duplicados usando

find . | tr A-Z a-z | sort | uniq -d

Luego, cambie manualmente el nombre de uno de los archivos para cada línea si sale. Intenta evitar crear duplicados en el futuro.

jmtd
fuente
El chico nunca dio a entender que él fue quien creó ese desastre.
tshepang
Bueno, sí, es cierto, pero él es el que sufre las consecuencias ☺
jmtd
Tengo una situación en la que terminé con copias de seguridad de tiempos ligeramente diferentes. Quiere combinarlos, pero no clobber diferentes versiones. Por ejemplo, por lo que sé, el más antiguo podría ser mejor. Solo puedo decir después de examinar. Mientras tanto, necesita copiar y cambiar el nombre de las copias de seguridad.
abalter