/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Bash script que sustituya al comando mv de UNIX

 
      Índice del Foro elrincondelc.com -> Otros lenguajes
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
jvr42



Registrado: 06 Nov 2012
Mensajes: 35
Ubicación: México

MensajePublicado: 20/03/2013 5:08 pm
Título: Bash script que sustituya al comando mv de UNIX

Hola,

Me gustaria que me dieran una ayuda o un empujon para poder escribir un script en Bash llamado mv (que sustituya al comando mv de UNIX) y que trate de cambiar el nombre del archivo especificado (usando el comando mv UNIX), pero si el archivo de destino existe, en lugar crea una especie de índice numerico, apenda al archivo de destino . Así que si escribo:

Código:
$ mv a.txt b.txt


pero b.txt ya existe, mv moverá el archivo a b.txt.1. Ahora que si b.txt.1 ya existe, debe cambiar el nombre del archivo a b.txt.2, y así sucesivamente, hasta que con éxito se puede cambiar el nombre del archivo con un nombre que no exista.

Cualquier cosa se agradece.
Volver arriba
daltomi



Registrado: 28 Abr 2007
Mensajes: 335
Ubicación: Argentina

MensajePublicado: 21/03/2013 3:44 am
Título:

Buenas.
Una posible solución:
Código:

#!/bin/bash

# Si argumentos != 2
if [ $# -ne 2 ]; then
    echo "Dos argumentos necesarios"
    exit 1
fi

# si destino existe...
if [ -f $2 ]; then
    for num in `seq 1000`; do #secuencia 1 a 1000
        TMP=$2.$num           # b.txt.1
        if [ -f $TMP ]; then  # si b.txt.num exite
            continue          # continuar buscando 
        else                  # si no 
            mv $1 $TMP        # mover a.txt -> b.txt.num
            break             # terminar for
        fi
    done
else
    # si destino no exite, mover normal
    # caso que no exista origen, error propio de comando mv
    mv $1 $2
fi


Saludos.
Volver arriba
Dirección AIM
jvr42



Registrado: 06 Nov 2012
Mensajes: 35
Ubicación: México

MensajePublicado: 21/03/2013 3:29 pm
Título:

Buenas,

daltomi escribió:
Buenas.
Una posible solución:
Saludos.


Gracias. Tengo otro par de preguntas si es posible:

¿Cómo se podría ajustar la variable PATH para poder reemplazar el comando mv de UNIX con este script?

La segunda:

¿Cómo implementarías un comando "limpiar" que elimine todos los archivos menos del número de versión más alto? Por ejemplo,

Código:
$ limpiar b.c
$ ls
a.c
b.c ; este era b.c.2


Gracias y saludos.
Volver arriba
daltomi



Registrado: 28 Abr 2007
Mensajes: 335
Ubicación: Argentina

MensajePublicado: 22/03/2013 2:14 am
Título:

Buenas.
El problema es que PATH existe en dos ámbitos, el del sistema y el del usuario.
A nivel del sistema:
Código:

export PATH=/bin/:/usr/bin/:/usr/local/bin/

A nivel del usuario:
Código:

export PATH=$PATH:/home/usuario/mi_directorio

Es decir lo que ya contiene PATH( $PATH ), más lo que el usuario desea.
Como el orden de los valores tiene prioridad, no podrías colocar un script mv en mi_directorio ya que la shell buscaría primero en /usr/bin.
La solución a este problema es utilizar otro nombre, por ejemplo mv.sh o algo parecido y escribir el comando exactamente con ese nombre.
Si de todas maneras si quieres realizar esto debes cambiar PATH desde el archivo .bashrc como lo anterior.

La solución mas factible es utilizar alias, también modificando .bashrc o algunas "distros" tienen el archivo .bash_aliases
Código:

alias ll='ls -lh'
alias mp='mplayer'
alias apagar='sudo shutdown -h now'
alias mv='/home/usuario/mi_directorio/mv.sh'


Cada vez que modifiques .bashrc debes iniciar una nueva shell para actualizar los cambios del entorno. Al script se le debe activar el modo de ejecución para que funcione con alias, ejemplo: chmod +x mv.sh

En cuanto a lo segundo, entiendo se deben ir eliminado todos los archivos de la secuencia excepto el último, que debe ser movido al archivo que se pasa como argumento.
Código:

#!/bin/bash

if [ $# -ne 1 ]; then
    echo "error faltan argumentos."
    exit 1
fi

ARCHIVO=$1

if [ -f $ARCHIVO ]; then
    for NUM in `seq 1000`; do
        TMP=$ARCHIVO.$NUM     
        if [ -f $TMP ]; then       
            NSG=`expr $NUM + 1`             #numero siguiente
            if [ -f $ARCHIVO.$NSG ]; then   #si exite siguiente
                rm $TMP                     #eliminar anterior
                continue                    #continuar buscando
            else                            #si no existe siguiente
                mv $TMP $ARCHIVO            #mover
                exit 1                      # y salir
            fi
        fi
    done
else
    echo "error no exite el archivo $ARCHIVO"
fi


Saludos.
Volver arriba
Dirección AIM
      Índice del Foro elrincondelc.com -> Otros lenguajes
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com