The UNIX and Linux Forums  
Hola y bienvenida de los Estados Unidos a la UNIX y Linux Foros! Gracias por su visita y formar parte de nuestra comunidad global.

Go Back   El UNIX y Linux Foros > Arriba Foros > Programación de scripts de shell y
.
google unix.com



Programación de scripts de shell y Plantear preguntas sobre KSH, CSH, SH, BASH, PERL, PHP, SED, AWK y otros scripts de shell y lenguajes de script de shell aquí.

Más UNIX y Linux Foro Temas usted puede encontrar útiles
Hilo Hilo para principiantes Foro Respuestas Último mensaje
función de correo problema jwholey Programación de scripts de shell y 4 05-01-2008 12:21 PM
Problema debido a la secuencia de comandos de directorios recursivo Ayuda por favor robertmcol Programación de scripts de shell y 2 04-27-2008 08:00 PM
Función del problema y CoreDump Zingaro Programación de scripts de shell y 8 02-19-2008 06:37 PM
función recursiva bebop1111116 Programación de Alto Nivel 1 10-30-2006 08:12 PM
PERL función problema avadhani Programación de scripts de shell y 2 06-15-2005 05:18 AM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered by Powered by Google
 
Linkback vínculo Herramientas de hilo Buscar en este Hilo Tasa de Hilo Modos de visualización
  #1 (Enlace permanente)  
Old 02-03-2007
malle malle is offline
Usuario Registrado
  
 

Fecha: enero 2007
Lugar: Kolkata
Puestos: 10
Problema con la función recursiva

Hola a todos,

Tengo que mover todos los archivos en un árbol de la estructura de directorios a un solo directorio. A fin de saber qué archivo es el directorio desde el cual, tendré que añadir el nombre del directorio para el nombre del archivo. Para ello he escrito una función recursiva que es el siguiente
---------------------------------------------
datamover ()
(
cd $ 1
# OLD_DIR \u003d $ 2
i en *
hacer
if [-d $ i]
entonces
$ I \u003d TMP_DIR
datamover $ TMP_DIR
echo $ i
algo más
mv $ i .. / $ i $ 1_

if [-f $ 1 /]
entonces
eco de algunos archivos todavía existen
algo más
cd ..
rmdir $ 1
fi

fi
hecho
)
-------------------------------------------------- --------------
Cuando se ejecute cada vez que el mismo en una estructura de directorios como
Dira -> DirB -> DirL -> fileN
-> DirM -> fileO
---> DirC -> DirP -> Filer
-> DirQ -> archivos

el programa está dando la salida de la siguiente manera
Dira -> DirB -> DirL_fileN
-> DirM_fileO
---> DirC -> DirP -> Filer
-> DirQ -> archivos

y la depuración ouptut es la siguiente
-------------------------------------------------- ----
+ Dir. Nombre echo es Dira
Nombre dir es Dira
+ \u003d MAIN_DIR Dira
+ Datamover Dira
+ Cd Dira
+ '['-D DirB ']'
+ TMP_DIR \u003d DirB
+ Datamover DirB
+ Cd DirB
+ '['-D DirL ']'
+ TMP_DIR \u003d DirL
+ Datamover DirL
+ Cd DirL
+ '['-D fileN ']'
+ Mv fileN .. / DirL_fileN
+ '['-F DirL / ']'
+ Cd ..
+ Rmdir DirL
+ Eco fileN
fileN
+ '['-D DirM ']'
+ TMP_DIR \u003d DirM
+ Datamover DirM
+ Cd DirM
+ '['-D fileO ']'
+ Mv fileO .. / DirM_fileO
+ '['-F DirM / ']'
+ Cd ..
+ Rmdir DirM
+ Eco fileO
fileO
+ Eco fileO
fileO
+ '['-D DirC ']'
+ Mv DirC .. / DirA_DirC
mv: no se puede estadísticas »DirC ': No such file or directory
+ '['-F Dira / ']'
+ Cd ..
+ Rmdir Dira
rmdir: «Dira ': No such file or directory
-------------------------------------------------- ------------

¿Puede alguien decirme wht es el problema con el código y cómo solucionarlo?
i exigir la salida en este escenario será el
Dira -> DirB_DirL_fileN
-> DirB_DirM_fileO
-> DirC_DirP_fileR
-> DirC_DirQ_fileS

Gracias de antemano
  #2 (Enlace permanente)  
Old 02-03-2007
zazzybob's Avatar
zazzybob zazzybob is offline Forum Advisor  
Registrado Geek
  
 

Fecha: diciembre 2003
Ubicación: Melbourne, Australia
Puestos: 2.100
Éste es un sencillo punto de partida ....
Código:
$ find dirA -type f -print | while read filename; do
>    mv ${filename} ./destDir/`echo ${filename} | sed 's!/!_!g'`
> done
$ find dirA -type f -print
$ ls destDir
dirA_dirB_dirE_file_4  dirA_dirC_dirF_dirI_file_7  dirA_dirC_file_2       dirA_dirD_file_3
dirA_dirB_file_1       dirA_dirC_dirF_file_5       dirA_dirD_dirG_file_6
Como puede ver, todos los archivos se mueven de a DESTDIR dira.

A continuación, puede simplemente rm-rf dira

¡Salud!
ZB
  #3 (Enlace permanente)  
Old 02-03-2007
sb008 sb008 is offline Forum Advisor  
Usuario Registrado
  
 

Fecha: enero 2007
Puestos: 384
Cita:
Publicado originalmente por zazzybob
Éste es un sencillo punto de partida ....
Código:
$ find dirA -type f -print | while read filename; do
>    mv ${filename} ./destDir/`echo ${filename} | sed 's!/!_!g'`
> done
$ find dirA -type f -print
$ ls destDir
dirA_dirB_dirE_file_4  dirA_dirC_dirF_dirI_file_7  dirA_dirC_file_2       dirA_dirD_file_3
dirA_dirB_file_1       dirA_dirC_dirF_file_5       dirA_dirD_dirG_file_6
Como puede ver, todos los archivos se mueven de a DESTDIR dira.

A continuación, puede simplemente rm-rf dira


¡Salud!
ZB
Esta es la manera de hacerlo.

El guión original a causa de la falla
i en *
declaración

El * es evaluado al comienzo de la función y no se anticipan en los archivos que se trasladó a un subdirectorio del directorio.
  #4 (Enlace permanente)  
Old 02-03-2007
hegemaro hegemaro is offline
Usuario Registrado
  
 

Fecha: febrero 2006
Lugar: Schenectady, NY
Puestos: 134
Arrow

zazzybob la solución es una solución simple y elegante.

En respuesta a la recursión en una función de shell Korn, hay dos puntos a considerar. Todas las variables, incluyendo el directorio de trabajo actual, son de alcance mundial a menos que se define con la función que a su vez hace que sean locales en la función.
Código:
typeset FILENAME=/etc/hosts

Function ()
{
    FILENAME=/etc/resolv.conf
    echo $FILENAME
}

echo $FILENAME
Function
echo $FILENAME
produciría

/ etc / hosts
/ etc / resolv.conf
/ etc / resolv.conf

Sin embargo,

Código:
typeset FILENAME=/etc/hosts

Function ()
{
    typeset FILENAME

    FILENAME=/etc/resolv.conf
    echo $FILENAME
}

echo $FILENAME
Function
echo $FILENAME
produciría
/ etc / hosts
/ etc / resolv.conf
/ etc / hosts

Una rápida y sucia manera de hacer que las variables locales a la función INCLUYENDO es el directorio de trabajo para ejecutar la función en su propio depósito, colocando paréntesis dentro de la función entre corchetes. La función de obtener su propia copia del medio ambiente cuando se les llama y los cambios, incluyendo el directorio, para que el medio ambiente no se refleja en el script que está llamando a su propia función.

Código:
typeset FILENAME=/etc/hosts

Function ()
{ (
    FILENAME=/resolv.conf
    echo $FILENAME
) }

echo $FILENAME
Function
echo $FILENAME
produciría
/ etc / hosts
/ etc / resolv.conf
/ etc / hosts

Última edición por hegemaro; al 02-03-2007 10:41 AM..
  #5 (Enlace permanente)  
Old 02-03-2007
malle malle is offline
Usuario Registrado
  
 

Fecha: enero 2007
Lugar: Kolkata
Puestos: 10
Gracias zazzybob. La solución fue fantástico.

Gracias a todos los que han dado algunas pistas más acerca de la solución.
Closed Thread

Marcadores

Herramientas de hilo Buscar en este Hilo
Buscar en este Hilo:

Búsqueda avanzada
Modos de visualización Vota a este hilo
Vota a este hilo:

Normas de envío
puede que no nuevo puesto de hilos
puede que no enviar respuestas
puede que no enviar archivos adjuntos
puede que no editar sus puestos

Código BB es Encendido
Emoticones son Encendido
[IMG] código Encendido
Código HTML es Apagado
Trackbacks son Encendido
Pingbacks son Encendido
Refbacks son Encendido




Todas las horas son GMT -4. La hora es 09:31 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traducciones de idiomas Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Estudios
El UNIX y Linux Foros Contenido Copyright © 1993-2009. Todos los derechos Reserved.Ad Gestión por RedTyger

Las direcciones URL de contenido vBSEO 3.2.0