El 27/06/2009 00:01, [email protected] escribió:
> Gustavo Panizzo <gfa> escribió:
>> hola, tengo q copiar files desde una ubicacion (A) a otra (B), el problema 
>> es que B tiene algunos files que estan en A, y que no quiero pisar.
>> pero tengo que tener TODO A en B
>>
>>
>> grafiquito
>> (A y B son las ubicaciones, 1 2 3 4 5 6 son los files)
>>
>> A   B
>> 1   
>> 2   2
>> 3   3 
>> 4  
>> 5   5
>> 6
>>
>> a mi me gustaria tener en B despues de la copia
>>
>> B
>> 1
>> 2
>> 2.A
>> 3
>> 3.A
>> 4
>> 5
>> 5.A
>> 6
>>
>>
>> pense en rsync, pero rsync hace backups de los files de destino (B) 
>> solamente, lo mismo cp
>>
>>
>> alguien tubo que hacer esto alguna ves? como le fue? que tool usaron?
>>
>>
>>
>> gracias!
>> --
>> Para desuscribirte tenés que visitar la página
>> https://listas.linux.org.ar/mailman/listinfo/lugar-gral/
>>
> Holas.....
> 
> Lo podés hacer con "cp" así:
> 
> $ cp --force --backup *.* ../p
> 
> A explicar...
> con --force --backup hacés que el cp copie sí o sí todo. En el caso de
> que exista ya un archivo igual al que copiás en el destino, crea una
> copia backup del ya existente ( le agrega un número... creo), y te copia
> el que seleccionaste.
> 
> Con *.* elegís todos del directorio origen, que es el directorio actual.
> el último es el dir destino, en este caso, otro subdirectorio del mismo
> directorio.
> 
> Espero haber sido claro... Probá primero en dos dir de prueba, valga la
> rebusnancia jaj :-)
> 
> Éxito
> 
> 

Un comentario: usar *.* para indicar "todos los archivos" es habitual en
los sistemas de MS, pero no en unix, donde se usa simplemente un
asterisco: *

Al indicar *.* estamos seleccionando los archivos que "al menos" tengan
un punto en su nombre, que pueden no ser todos.

Por ejemplo: si en el directorio tenemos los archivos:
        uno
        dos.txt
        tres.dat
solo se copiarán los archivos dos.txt y tres.dat. El archivo 'uno' será
ignorado.

Otro comentario: el cp con --backup copiará TODOS los archivos
especificados, y aquellos que ya existan en el destino serán renombrados
como nombreoriginal~ UNA SOLA VEZ. La próxima vez que se repita el
proceso, se pisará el backup, porque hay 1 único archivo de backup, sin
secuencias ni timestamp. Si es lo deseado, perfecto.

Igual, si entendí bien lo que quiere Gustavo, es que queden renombrados
los archivos 'copiados' y no el original del destino. Y esto sería lo
contrario. Porque renombra al original (de ahí 'backup') y con viejo
nombre queda el contenido del archivo de origen.

Agregar el parámetro -r si se requiere hacerlo recursivo, para copiar
también el contenido de los subdirectorios.

No se me ocurre ninguna manera directa de hacerlo, sino probá algo así:

#!/bin/bash
ORIGEN=~/tmp
DESTINO=~/kk
#SUFIJO=".nuevo"
SUFIJO=".`date +%F.%T`"
FILES=`ls $ORIGEN/*`
for F in $FILES
do
        FILE_NAME=`basename $F`
        if [ -f "$DESTINO/$FILE_NAME" ]
        then
                echo "Archivo: $FILE_NAME Ya existe"
                cp $F $DESTINO/$FILE_NAME$SUFIJO
        else
                echo "Archivo: $FILE_NAME ES NUEVO"
                cp $F $DESTINO/$FILE_NAME
        fi
done

Guardalo como script, en un archivo por ej cp.sh. Se podría mejorar
bastante, por ej, pasando origen y destino por parámetros. Lo dejo como
tarea para el hogar :D.

Tal vez sería interesante comparar los archivos con diff.

Cualquier cosa, una guía rápida de bash:
http://www.linuxconfig.org/Bash_scripting_Tutorial

Slds.-
Pablo



--
Para desuscribirte tenés que visitar la página
https://listas.linux.org.ar/mailman/listinfo/lugar-gral/

Responder a