The UNIX and Linux Forums  
Hei og Velkommen fra USA til UNIX og Linux Forums! Takk for besøket og Delta i vårt globale samfunn.

Go Back   UNIX og Linux Forums > Top Forums > Shell programmering og Skripting
.
google unix.com



Shell programmering og Skripting Post spørsmål om ksh, csh, SH, Bash, Perl, PHP, SED, awk og ANDRE shell scripts og Shell skriptespråk her.

Mer UNIX og Linux Forum Emner Du kan finne nyttig
Tråd Tråd startet Forum Svar Siste innlegg
postfunksjonen problem jwholey Shell programmering og Skripting 4 05-01-2008 11:21
Script problemet skyldes Rekursiv kataloger Hjelp vennligst robertmcol Shell programmering og Skripting 2 04-27-2008 07:00
Funksjon Problem og CoreDump ZINGARO Shell programmering og Skripting 8 02-19-2008 06:37
Rekursiv funksjon bebop1111116 High Level Programmering 1 10-30-2006 08:12
PERL funksjon problem avadhani Shell programmering og Skripting 2 06-15-2005 04:18

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 Søk i denne tråden Rate Thread Visningsmoduser
  #1 (permalink)  
Old 02-03-2007
Malle malle is offline
Registrert bruker
  
 

Bli Date: Jan 2007
Beliggenhet: Kolkata
Innlegg: 10
Problemet med Rekursiv funksjon

Hei alle,

Jeg må flytte alle filene i et tre katalogstrukturen til en enkelt katalog. Inorder å vite hvilken fil som katalog, jeg nødt til å legge inn navnet på katalogen til filnavnet. For denne skrev jeg en Rekursiv funksjon som er som følger:
---------------------------------------------
datamover ()
(
cd $ 1
# OLD_DIR \u003d $ 2
for i in *
gjøre
Hvis [-d $ i]

TMP_DIR \u003d $ i
datamover $ TMP_DIR
echo $ i
ellers
mv $ i .. / $ 1_ $ i

Hvis [-f $ 1 /]

echo noen filer fortsatt eksisterer
ellers
cd ..
RMDIR $ 1
fi

fi
ferdig
)
-------------------------------------------------- --------------
Når noen jeg kjøre det samme på en katalogstruktur slik
DirA -> DirB -> DirL -> fileN
-> DirM -> fileO
---> DirC -> DirP -> Filer
-> DirQ -> filer

programmet er å gi utdatafilen som følger
DirA -> DirB -> DirL_fileN
-> DirM_fileO
---> DirC -> DirP -> Filer
-> DirQ -> filer

og feilsøke ouptut som følger
-------------------------------------------------- ----
+ Echo Dir er DirA
Dir er DirA
+ MAIN_DIR \u003d 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
+ Echo fileN
fileN
+ '['-D DirM ']'
+ TMP_DIR \u003d DirM
+ Datamover DirM
+ Cd DirM
+ '['-D fileO ']'
+ Mv fileO .. / DirM_fileO
+ '['-F DirM / ']'
+ Cd ..
+ RMDIR DirM
+ Echo fileO
fileO
+ Echo fileO
fileO
+ '['-D DirC ']'
+ Mv DirC .. / DirA_DirC
mv: kan ikke stat `DirC": Ingen slik fil eller katalog
+ '['-F DirA / ']'
+ Cd ..
+ RMDIR DirA
RMDIR: `DirA": Ingen slik fil eller katalog
-------------------------------------------------- ------------

Kan noen fortelle meg wht er problemet med koden og hvordan du kan løse det?
utdataene jeg kreve i dette scenariet vil være så
DirA -> DirB_DirL_fileN
-> DirB_DirM_fileO
-> DirC_DirP_fileR
-> DirC_DirQ_fileS

Takk på forhånd
  #2 (permalink)  
Old 02-03-2007
zazzybob's Avatar
zazzybob zazzybob is offline Forum Advisor  
Registrert Geek
  
 

Bli Dato: desember 2003
Sted: Melbourne, Australia
Innlegg: 2100
Her er et utgangspunkt ....
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
Som du kan se alle filer flyttes fra dirA til destDir.

Du kan da bare rm-rf dirA

Skål
ZB
  #3 (permalink)  
Old 02-03-2007
sb008 sb008 is offline Forum Advisor  
Registrert bruker
  
 

Bli Date: Jan 2007
Innlegg: 384
Sitat:
Originally Posted by zazzybob
Her er et utgangspunkt ....
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
Som du kan se alle filer flyttes fra dirA til destDir.

Du kan da bare rm-rf dirA


Skål
ZB
Dette er måten å gjøre det.

Den opprinnelige script mislykkes på grunn av
for i in *
uttalelse

Det * er evaluert ved starten av funksjon, og forventer ikke på filer flyttes til den aktuelle katalogen fra en underkatalog.
  #4 (permalink)  
Old 02-03-2007
hegemaro hegemaro is offline
Registrert bruker
  
 

Bli Date: Feb 2006
Beliggenhet: Schenectady, NY
Innlegg: 134
Arrow

zazzybob løsning er en elegant og enkel løsning.

Grunna rekursjon innen Korn shell funksjon, er det to punkter for å vurdere. Alle variabler, inkludert gjeldende arbeidsmappen er global, med mindre spesifikt definert med funksjonen som da gjør at de lokale innenfor funksjon.
Code:
typeset FILENAME=/etc/hosts

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

echo $FILENAME
Function
echo $FILENAME
ville produsere

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

Uansett, imidlertid,

Code:
typeset FILENAME=/etc/hosts

Function ()
{
    typeset FILENAME

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

echo $FILENAME
Function
echo $FILENAME
ville produsere
/ etc / hosts
/ etc / resolv.conf
/ etc / hosts

En rask og skitten måte å gjøre variabler lokale til funksjonen HERUNDER arbeidsgruppen katalogen er å utføre funksjonen i eget skall ved å plassere parentes i funksjon parentes. Funksjonen vil få sin egen kopi av miljøet når ringte og eventuelle endringer, inkludert katalogen til at miljøet ikke vil bli reflektert i den ringer script som er sin egen funksjon.

Code:
typeset FILENAME=/etc/hosts

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

echo $FILENAME
Function
echo $FILENAME
ville produsere
/ etc / hosts
/ etc / resolv.conf
/ etc / hosts

Sist endret av hegemaro; 02-03-2007 på 10:41..
  #5 (permalink)  
Old 02-03-2007
Malle malle is offline
Registrert bruker
  
 

Bli Date: Jan 2007
Beliggenhet: Kolkata
Innlegg: 10
Takk zazzybob. Løsningen var fantastisk.

Takk til alle som har gitt noen flere tips om løsningen.
Closed Thread

Hugseliste

Thread Tools Søk i denne tråden
Søk i denne tråden:

Avansert søk
Visningsmoduser Ranger denne tråden
Ranger denne tråden:

Innleggsaktivitet Regler
Du kanskje ikke poste nye tråder
Du kanskje ikke poste svar
Du kanskje ikke post vedlegg
Du kanskje ikke redigere innleggene dine

BB-kode er
Smilefjes er
[IMG] koden
HTML-koden Av
Pingbacks er
Refbacks er




Alle klokkeslett er GMT -4. Nå er klokken 12:47.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Language Translations Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX og Linux Forums Content Copyright © 1993-2009. All Rights Reserved.Ad Management by RedTyger

Content Relevant nettadresser av vBSEO 3.2.0