Comando cp, copiar sin sobreescribir -solucionado-

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )
Avatar de Usuario
EnriqueK
Forista Medio
Forista Medio
Mensajes: 367
Registrado: Dom Sep 16, 2007 7:00 am

Re: Comando cp, copiar sin sobreescribir

Mensaje por EnriqueK »

Esta vez si funcionó, ahora ya coinciden los valores de find y el número de archivos copiados, por lo que ya puedo dar por soluconado y muchas gracias

Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1838
Registrado: Dom Oct 10, 2004 7:00 am

Re: Comando cp, copiar sin sobreescribir -solucionado-

Mensaje por neurus »

De vez en cuando me aburro y, como los nacidos en África del Este, me pongo a revisar scripts.

Va otra versión. No mejora nada, y ni siquiera reviste más utilidad que la versión anterior. Pero puede servirle a alguien que quiera saber cómo implementar una barra de progreso en dialog.

Sobre todo, por la imposibilidad de Bash de calcular números decimales y, por lo tanto, calcular el porcentaje de manera más o menos racional.

Código: Seleccionar todo

#!/bin/bash
IFS=$'\x0A'$'\x0D'
if [ $# -ne 3 ]
then
echo "Uso: $0 origen extension destino"
exit 
fi


ORIGEN=$1
EXT=$2
DEST=$3
count=0
  
find $ORIGEN -iname "*.$EXT" >/tmp/.total
total=`cat /tmp/.total|wc -l`
rel=`expr $total \/ 100`
lineas=`expr $(tput lines) - 6`
for i in `cat /tmp/.total`; do
    if [ -f $DEST/`basename $i` ] ; then

	cp $i $DEST/`basename $i .pdf`_copia_$(date|awk '{print $4}'|sed 's/://g').pdf
	echo "copiado $i">> registro.log
	count=`expr $count + 1`
	
    else
        cp $i $DEST
	echo "copiado $i">> registro.log 
	count=`expr $count + 1`
    fi
	porc=`expr $count \/ $rel`
	echo $porc |dialog --gauge "`tail -n $lineas registro.log`" `tput lines` `tput cols`
done
exit


Imagen

Avatar de Usuario
niky45
Forista Ancestral
Forista Ancestral
Mensajes: 9187
Registrado: Jue Abr 12, 2007 7:00 am
Ubicación: tras la pantalla (...)
Contactar:

Re: Comando cp, copiar sin sobreescribir -solucionado-

Mensaje por niky45 »

@ neurus: creo que quedaria bastante mas limpio con bc. si bien, te voy a admitir que meterle los porcentajes a dialog no es tarea facil. pero lo de calcularlo.... :?

por cierto:

Código: Seleccionar todo

date +%H:%M:%S 
se que lo tuyo es falta de ganas de leer el man, pero... esque esa llamada a awk ahi queda rara. ;)
#446716
>>"Linux: the operating system with a CLUE... Command Line User Environment".
(seen in a posting in comp.software.testing)

[ DNFD ] - [ F4A ] - [ dotfiles ]

Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1838
Registrado: Dom Oct 10, 2004 7:00 am

Re: Comando cp, copiar sin sobreescribir -solucionado-

Mensaje por neurus »

¡Eso era! yo lo recordaba vagamente, pero me estaba olvidando de agregarle el signo +.

De todos modos, lo que yo quería era sin los dos puntos, porque puede dar problemas con el nombre del archivo.

Es decir:

Código: Seleccionar todo

date +%H%M%S
En cuanto al uso de bc, se me ocurrió pero no es realmente mucho más limpio el resultado. Sólo algo más fácil de entender. Lo hice con Bash "puro" porque me encapriché en que tenía que sacar los porcentajes inversos con Bash.

Lo de date + awk + sed sí, admito que era ridículo. Pero no recordaba el comando, y a veces uno siente que si lee el man, ha sido derrotado por la línea de comandos.

El mismo script, sin awk y sed, con bc, quedaría así. Como ves, no es mucho más limpio que el anterior. Sólo se elimina la variable $rel, que era la que establecía la relación porcentual inversa con respecto al total.

Código: Seleccionar todo

#!/bin/bash
IFS=$'\x0A'$'\x0D'
if [ $# -ne 3 ]
then
echo "Uso: $0 origen extension destino"
exit 
fi


ORIGEN=$1
EXT=$2
DEST=$3
count=0

  
find $ORIGEN -iname "*.$EXT" >/tmp/.total
total=`cat /tmp/.total|wc -l`

lineas=`expr $(tput lines) - 6`
for i in `cat /tmp/.total`; do
    if [ -f $DEST/`basename $i` ] ; then

	cp $i $DEST/`basename $i .pdf`_copia_$(date +%H%M%S).pdf
	echo "copiado $i">> registro.log
	count=`expr $count + 1`
	
    else
        cp $i $DEST
	echo "copiado $i">> registro.log 
	count=`expr $count + 1`
    fi
	porc=`echo $count*100/$total|bc`
	if [ -x /usr/bin/dialog ]; then
		echo $porc |dialog --gauge "`tail -n $lineas registro.log`" `tput lines` `tput cols`;
		else tail -n $lineas registro.log;
	fi
done
exit
Editado -- Dom Ago 05, 2012 12:36 am --

Señor Cacumen: hay cosas que no se hacen. Porque estan mal vistas. Porque son desleales.

Por ejemplo: copiar el conocimiento aportado por un usuario de un sitio, para publicarlo sin citar la fuente en otro sitio. Hasta con los mismos errores del sitio original: en mi script, esta línea funciona sólo con un tipo de fichero:

Código: Seleccionar todo

cp $i $DEST/`basename $i .pdf`_copia_$(date|awk '{print $4}'|sed 's/://g').pdf
Lo correcto sería:

Código: Seleccionar todo

cp $i $DEST/`basename $i $EXT`_copia_$(date|awk '{print $4}'|sed 's/://g')$EXT
Ahora vaya a esdebian y corrija mi script. Y no vaya a mencionar este sitio, a ver si allí lo reprenden...

albertalvarezbruned
Forista Nuevo
Forista Nuevo
Mensajes: 1
Registrado: Sab Jul 23, 2022 6:17 pm

Re: Comando cp, copiar sin sobreescribir -solucionado-

Mensaje por albertalvarezbruned »

eh encontrado este switch de "cp" y funciona:

switch de cp:
-n, --no-clobber
do not overwrite an existing file (overrides a previous -i option)

cp -n myoldfile.txt mycopiedfile.txt
cp --no-clobber myoldfile.txt mycopiedfile.txt


fuente:
https://stackoverflow.com/questions/939 ... -overwrite

Responder
  • Temas similares
    Respuestas
    Vistas
    Último mensaje