The UNIX and Linux Forums  
Bonjour et bienvenu par les États-Unis à la UNIX et Linux Forums! Merci de votre visite et vous joindre à notre communauté mondiale.

Go Back   Les systèmes UNIX et Linux Forums > Top Forums > De programmation et de script Shell
.
google unix.com



De programmation et de script Shell Posez vos questions à propos de KSH, CSH, SH, BASH, PERL, PHP, SED, awk et d'autres scripts shell et les langages de script shell ici.

Plus d'UNIX et Linux Forum Sujets Vous trouverez peut-être utile
Fil Thread Starter Forum Réponses Last Post
fonction mail problème jwholey De programmation et de script Shell 4 05-01-2008 12:21 PM
Script problème de répertoires récursifs Aide s'il vous plaît robertmcol De programmation et de script Shell 2 04-27-2008 08:00 PM
Fonction problème et Coredump ZINGARO De programmation et de script Shell 8 02-19-2008 06:37 PM
fonction récursive bebop1111116 High Level Programming 1 10-30-2006 08:12 PM
PERL fonction problème avadhani De programmation et de script Shell 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 Thread Tools Recherche sur ce Thread Rate Thread Modes d'affichage
  #1 (permalink)  
Old 02-03-2007
malle malle is offline
Registered User
  
 

Join Date: Jan 2007
Lieu: Kolkata
Messages: 10
Problème avec la fonction récursive

Salut à tous,

J'ai déplacer tous les fichiers dans une arborescence de structure de répertoire d'un répertoire unique. Afin de savoir quel fichier est à partir de quel répertoire, je vais avoir à ajouter le nom du répertoire au nom du fichier. Pour cela j'ai écrit une fonction récursive qui est comme suit
---------------------------------------------
datamover ()
(
cd $ 1
# OLD_DIR \u003d $ 2
for i in *
faire
if [-d $ i]
puis
$ I \u003d TMP_DIR
datamover $ TMP_DIR
echo $ i
autre
mv $ i .. / $ 1_ $ i

if [-f $ 1 /]
puis
echo certains fichiers existent encore
autre
cd ..
rmdir $ 1
fi

fi
fait
)
-------------------------------------------------- --------------
Lorsque j'exécute toujours le même sur une structure de répertoire comme
Dira -> DirB -> DirL -> filen
-> DIRM -> fileO
---> Dirc -> DirP -> filer
-> DirQ -> fichiers

le programme est de donner le résultat comme suit
Dira -> DirB -> DirL_fileN
-> DirM_fileO
---> Dirc -> DirP -> filer
-> DirQ -> fichiers

et le débogage ouptut est la suivante
-------------------------------------------------- ----
+ Echo Dir Name is Dira
Nom Dir est Dira
+ \u003d MAIN_DIR Dira
+ Datamover Dira
+ Cd Dira
+ '[' DirB-d ']'
+ TMP_DIR \u003d DirB
+ Datamover DirB
+ Cd DirB
+ '[' DirL-d ']'
+ TMP_DIR \u003d DirL
+ Datamover DirL
+ Cd DirL
+ '[' Filen-d ']'
+ Filen mv .. / DirL_fileN
+ '['-F DirL / ']'
+ Cd ..
+ Rmdir DirL
+ Echo filen
filen
+ '[' DIRM-d ']'
+ \u003d TMP_DIR DIRM
+ Datamover DIRM
+ Cd DIRM
+ '[' FileO-d ']'
+ FileO mv .. / DirM_fileO
+ '['-F DIRM / ']'
+ Cd ..
+ Rmdir DIRM
+ Echo fileO
fileO
+ Echo fileO
fileO
+ '[' Dirc-d ']'
+ Dirc mv .. / DirA_DirC
mv: ne peut stat `dirc ': Aucun fichier ou répertoire
+ '[' Dira-f / ']'
+ Cd ..
+ Rmdir Dira
rmdir: «Dira ': Aucun fichier ou répertoire
-------------------------------------------------- ------------

Quelqu'un peut-il me dire blanc est le problème avec le code et comment le corriger?
i exiger la production de ce scénario sera le
Dira -> DirB_DirL_fileN
-> DirB_DirM_fileO
-> DirC_DirP_fileR
-> DirC_DirQ_fileS

Merci à l'avance
  #2 (permalink)  
Old 02-03-2007
zazzybob's Avatar
zazzybob zazzybob is offline Forum Advisor  
Inscrits Geek
  
 

Join Date: Dec 2003
Lieu: Melbourne, Australie
Messages: 2100
Voici un simple point de départ ....
Code:
$ 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
Comme vous pouvez le voir, tous les fichiers sont déplacés d'dira à destination.

Vous pouvez alors simplement rm-rf dira

À la vôtre
ZB
  #3 (permalink)  
Old 02-03-2007
sb008 sb008 is offline Forum Advisor  
Registered User
  
 

Join Date: Jan 2007
Posts: 384
Citation:
Posté par zazzybob
Voici un simple point de départ ....
Code:
$ 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
Comme vous pouvez le voir, tous les fichiers sont déplacés d'dira à destination.

Vous pouvez alors simplement rm-rf dira


À la vôtre
ZB
C'est la façon de le faire.

Le script original échoue à cause de la
for i in *
déclaration

Le * est évalué au départ de la fonction et de ne pas anticiper sur les fichiers déplacés vers le répertoire à partir d'un sous-répertoire.
  #4 (permalink)  
Old 02-03-2007
hegemaro hegemaro is offline
Registered User
  
 

Join Date: Feb 2006
Lieu: Schenectady, NY
Messages: 134
Arrow

zazzybob la solution est une solution simple et élégante.

En réponse à la récursivité dans un shell Korn fonction, il ya deux points à considérer. Toutes les variables, y compris le répertoire de travail courant, ont une dimension mondiale à moins que spécifiquement définie avec la fonction qui fait leur local au sein de la fonction.
Code:
typeset FILENAME=/etc/hosts

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

echo $FILENAME
Function
echo $FILENAME
se produire

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

Cependant,

Code:
typeset FILENAME=/etc/hosts

Function ()
{
    typeset FILENAME

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

echo $FILENAME
Function
echo $FILENAME
se produire
/ etc / hosts
/ etc / resolv.conf
/ etc / hosts

Une façon rapide et sale pour les variables locales à la fonction Y COMPRIS le répertoire de travail est d'exécuter la fonction dans sa propre coquille par la mise entre parenthèses au sein de la fonction entre parenthèses. La fonction obtenir sa propre copie de l'environnement en cas d'appel et de toute modification, y compris le répertoire, pour que l'environnement ne seront pas reflétées dans le script d'appel qui est de sa propre fonction.

Code:
typeset FILENAME=/etc/hosts

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

echo $FILENAME
Function
echo $FILENAME
se produire
/ etc / hosts
/ etc / resolv.conf
/ etc / hosts

Dernière édition par hegemaro; au 02.03.2007 10:41 AM..
  #5 (permalink)  
Old 02-03-2007
malle malle is offline
Registered User
  
 

Join Date: Jan 2007
Lieu: Kolkata
Messages: 10
Merci zazzybob. La solution a été fantastique.

Merci à tous ceux qui a donné quelques indices sur plus de la solution.
Closed Thread

Bookmarks

Thread Tools Recherche sur ce Thread
Recherche sur ce Thread:

Recherche avancée
Modes d'affichage Rate this thread
Rate this thread:

Règles de messages
Tu mai pas de nouvelles discussions: nonoui
Tu mai pas envoyer des réponses:
Tu mai pas envoyer des pièces jointes
Tu mai pas modifier vos messages

BB code est Sur
Smilies sont Sur
[IMG] code est Sur
Le code HTML est Hors tension
Trackbacks sont Sur
Pingbacks sont Sur
Refbacks sont Sur




Toutes les heures sont au format GMT -4. Le temps est maintenant 11:32 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traductions Langue Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
Les systèmes UNIX et Linux Forums Content Copyright © 1993-2009. Tous droits Reserved.Ad de gestion par RedTyger

Content Relevant URLs par vBSEO 3.2.0