The UNIX and Linux Forums  


Go Back   UNIX och Linux Forum > Upp Forum > Shell-programmering och Skript
.
google unix.com



Shell-programmering och Skript Post frågor om ksh, CSH, SH, bash, PERL, PHP, sed, awk och andra skalskript och skal skriptspråk här.

Mer UNIX och Linux Forum Ämnen Du kan hitta Helpful
Tråd Thread Starter Forum Svar Senaste Inlägg
postfunktionen problem jwholey Shell-programmering och Skript 4 05-01-2008 12:21
Script problemet beror på rekursiv kataloger Hjälp snälla robertmcol Shell-programmering och Skript 2 04-27-2008 08:00
Funktion Problem och CoreDump ZINGARO Shell-programmering och Skript 8 02-19-2008 06:37
rekursiv funktion bebop1111116 High Level Programming 1 10-30-2006 08:12
PERL funktion problem avadhani Shell-programmering och Skript 2 06-15-2005 05: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 denna tråd Rate Thread Visningslägen
  #1 (permalänk)  
Old 02-03-2007
Malle malle is offline
Registered User
  
 

Join Date: Jan 2007
Ort: Kolkata
Inlägg: 10
Problem med Recursive funktion

Hej alla,

Jag måste flytta alla filer i ett träd katalogstrukturen till en enda katalog. Inorder att veta vilken fil som är från vilken katalog, jag måste lägga till namnet på den katalog till filnamnet. För detta skrev jag en rekursiv funktion som ser ut som följer
---------------------------------------------
datamover ()
(
cd $ 1
# OLD_DIR \u003d $ 2
for i in *
göra
Om [-d $ i]
sedan
TMP_DIR \u003d $ i
datamover $ TMP_DIR
echo $ i
annan
mv $ i .. / $ 1_ $ i

Om [-f $ 1 /]
sedan
echo några filer fortfarande finns
annan
cd ..
rmdir $ 1
fi

fi
gjord
)
-------------------------------------------------- --------------
När allt jag köra samma på en katalogstruktur som
DIRA -> DirB -> DirL -> fileN
-> DirM -> fileO
---> DirC -> DirP -> filer
-> DirQ -> filer

programmet ger utdata som följer
DIRA -> DirB -> DirL_fileN
-> DirM_fileO
---> DirC -> DirP -> filer
-> DirQ -> filer

och felsöka ouptut är följande
-------------------------------------------------- ----
+ Echo Dir namn är DIRA
Dir namn är 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 inte status "DirC: Ingen sådan fil eller katalog
+ '['-F DIRA / "]"
+ Cd ..
+ Rmdir DIRA
rmdir: "DIRA: Ingen sådan fil eller katalog
-------------------------------------------------- ------------

Kan någon berätta för mig wht är problemet med koden och hur man kan korrigera det?
utdatat Jag kräver i detta scenario blir så
DIRA -> DirB_DirL_fileN
-> DirB_DirM_fileO
-> DirC_DirP_fileR
-> DirC_DirQ_fileS

Tack på förhand
  #2 (permalänk)  
Old 02-03-2007
zazzybob's Avatar
zazzybob zazzybob is offline Forum Advisor  
Registrerad Geek
  
 

Join Date: Dec 2003
Ort: Melbourne, Australien
Inlägg: 2100
Här är en enkel utgångspunkt ....
Kod:
$ 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 alla filer flyttas från DIRA att målkat.

Du kan sedan bara rm-rf DIRA

Skål
ZB
  #3 (permalänk)  
Old 02-03-2007
sb008 sb008 is offline Forum Advisor  
Registered User
  
 

Join Date: Jan 2007
Inlägg: 384
Citat:
Ursprungligen postat av zazzybob
Här är en enkel utgångspunkt ....
Kod:
$ 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 alla filer flyttas från DIRA att målkat.

Du kan sedan bara rm-rf DIRA


Skål
ZB
Detta är rätt sätt att göra det.

Den ursprungliga manus misslyckas på grund av
for i in *
uttalande

Den * utvärderas i början av funktionen och inte förutse om filer flyttas till den katalogen från en underkatalog.
  #4 (permalänk)  
Old 02-03-2007
hegemaro hegemaro is offline
Registered User
  
 

Join Date: februari 2006
Ort: Schenectady, NY
Inlägg: 134
Arrow

zazzybob lösning är en elegant och enkel lösning.

Som svar på rekursion inom Korn shell funktion, det finns två saker att beakta. Alla variabler, inklusive den aktuella arbetskatalogen, är globala, om inte särskilt definieras med den funktion som sedan gör att de lokala inom funktionen.
Kod:
typeset FILENAME=/etc/hosts

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

echo $FILENAME
Function
echo $FILENAME
skulle producera

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

Men,

Kod:
typeset FILENAME=/etc/hosts

Function ()
{
    typeset FILENAME

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

echo $FILENAME
Function
echo $FILENAME
skulle producera
/ etc / hosts
/ etc / resolv.conf
/ etc / hosts

Ett snabbt och smutsigt sätt att göra variabler lokal till funktionen inklusive arbetsmiljön katalog är att verkställa en funktion i sina egna skal genom att placera parentes inom funktionen parentes. Funktionen kommer att få en egen kopia av miljön när kallade och alla ändringar, inklusive katalog, till att miljön inte kommer att återspeglas i den uppringande script som är sin egen funktion.

Kod:
typeset FILENAME=/etc/hosts

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

echo $FILENAME
Function
echo $FILENAME
skulle producera
/ etc / hosts
/ etc / resolv.conf
/ etc / hosts

Senast redigerad av hegemaro; 02-03-2007 vid 10:41..
  #5 (permalänk)  
Old 02-03-2007
Malle malle is offline
Registered User
  
 

Join Date: Jan 2007
Ort: Kolkata
Inlägg: 10
Tack zazzybob. Lösningen blev fantastiskt.

Tack till alla som har lite mer tips om lösning.
Closed Thread

Komihåglista

Thread Tools Sök i denna tråd
Sök i denna tråd:

Avancerad sökning
Visningslägen Betygsätt denna tråd
Betygsätt denna tråd:

Utstationering Regler
Du får inte efter nya trådar
Du får inte efter svar
Du får inte skicka bilagor
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG] kod
HTML-koden är Av
Trackback är
Pingbacks är
Refbacks är




Alla tider är GMT -4. Klockan är nu 09:34.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Översättningar Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX och Linux Forum Innehållet upphovsrättsskyddat © 1993-2009. All Rights Reserved.Ad förvaltning RedTyger

Content Relevant webbadresser från vBSEO 3.2.0