The UNIX and Linux Forums  


Go Back   UNIX e Linux Forum > Inizio Forum > Shell scripting e di programmazione
.
google unix.com



Shell scripting e di programmazione Pubblica domande su KSH, CSH, SH, Bash, Perl, PHP, sed, awk e da altri script di shell e linguaggi di scripting shell qui.

Più di UNIX e Linux Forum Argomenti potreste trovare utili
Filo Thread Starter Forum Risposte Ultimo Post
funzione mail problema jwholey Shell scripting e di programmazione 4 05-01-2008 12:21 PM
Script problema dovuto alla directory ricorsive Aiuto per favore robertmcol Shell scripting e di programmazione 2 04-27-2008 08:00 PM
Funzione problema e coredump ZINGARO Shell scripting e di programmazione 8 02-19-2008 06:37 PM
funzione ricorsiva bebop1111116 Di programmazione ad alto livello 1 10-30-2006 08:12 PM
PERL funzione problema avadhani Shell scripting e di programmazione 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 Cerca in questo Thread Rate Thread Modalità di visualizzazione
  #1 (permalink)  
Old 02-03-2007
malle malle is offline
Utente Registrato
  
 

Iscriviti Data: gennaio 2007
Località: Kolkata
Interventi: 10
Problema con funzione ricorsiva

Ciao a tutti,

Ho per spostare tutti i file in un albero di struttura di directory per una singola directory. Inorder di sapere quale file è da quale directory, mi dovrete aggiungere il nome della directory per il nome del file. Per questo ho scritto una funzione ricorsiva, che è la seguente
---------------------------------------------
datamover ()
(
cd $ 1
# OLD_DIR \u003d $ 2
for i in *
fare
if [-d $ i]
allora
TMP_DIR $ i \u003d
datamover $ TMP_DIR
echo $ i
altro
mv $ i .. / 1_ $ $ i

if [-f $ 1 /]
allora
echo alcuni file esistono ancora
altro
cd ..
rmdir $ 1
fi

fi
fatto
)
-------------------------------------------------- --------------
Quando mai ho eseguito lo stesso su una struttura di directory come
DIRA -> DirB -> DirL -> fileN
-> DirM -> fileO
---> DirC -> DirP -> filer
-> DirQ -> file

il programma è che l'output come segue
DIRA -> DirB -> DirL_fileN
-> DirM_fileO
---> DirC -> DirP -> filer
-> DirQ -> file

e il debug ouptut è il seguente
-------------------------------------------------- ----
+ Eco Dir. Nome DIRA
Dir. Nome 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: non può stat `DirC ': Nessun file o directory
+ '['-F DIRA / ']'
+ Cd ..
+ Rmdir DIRA
rmdir: `DIRA ': Nessun file o directory
-------------------------------------------------- ------------

Can anybody tell me WHT il problema con il codice e come correggerle?
i richiedono l'uscita in questo scenario sarà come
DIRA -> DirB_DirL_fileN
-> DirB_DirM_fileO
-> DirC_DirP_fileR
-> DirC_DirQ_fileS

Grazie in anticipo
  #2 (permalink)  
Old 02-03-2007
zazzybob's Avatar
zazzybob zazzybob is offline Forum Advisor  
Registrato Geek
  
 

Iscriviti Data: dicembre 2003
Località: Melbourne, Australia
Interventi: 2.100
Ecco un semplice punto di partenza ....

Codice:
$ 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

Come si può vedere, tutti i file vengono spostati da DIRA a DESTDIR.

È quindi possibile solo rm-rf DIRA

Salute
ZB
  #3 (permalink)  
Old 02-03-2007
sb008 sb008 is offline Forum Advisor  
Utente Registrato
  
 

Iscriviti Data: gennaio 2007
Interventi: 384
Citazione:
Originalmente inviato da zazzybob
Ecco un semplice punto di partenza ....

Codice:
$ 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

Come si può vedere, tutti i file vengono spostati da DIRA a DESTDIR.

È quindi possibile solo rm-rf DIRA


Salute
ZB
Questo è il modo per farlo.

La sceneggiatura non originale a causa della
for i in *
affermazione

* La linea è valutato al inizio della funzione e non anticipare il file che si trasferisce a directory da una sottodirectory.
  #4 (permalink)  
Old 02-03-2007
hegemaro hegemaro is offline
Utente Registrato
  
 

Iscriviti Data: febbraio 2006
Località: Schenectady, NY
Interventi: 134
Arrow

zazzybob La soluzione è un elegante e semplice soluzione.

In risposta alla ricorsione Korn shell all'interno di una funzione, vi sono due punti da considerare. Tutte le variabili, tra cui l'attuale directory di lavoro, a meno che siano specificamente definite a livello mondiale con la funzione che poi li rende locale entro la funzione.

Codice:
typeset FILENAME=/etc/hosts

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

echo $FILENAME
Function
echo $FILENAME

produrrebbe

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

Comunque,


Codice:
typeset FILENAME=/etc/hosts

Function ()
{
    typeset FILENAME

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

echo $FILENAME
Function
echo $FILENAME

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

Un rapido e sporco modo per rendere le variabili locali alla funzione COMPRESI la directory di lavoro è quello di eseguire la funzione nel proprio guscio mettendo parentesi all'interno della funzione parentesi. La funzione di ottenere la propria copia di chiamata quando l'ambiente e le eventuali modifiche, compresa la directory, in questo ambiente non saranno riflesse nella chiamata di script che è la sua propria funzione.


Codice:
typeset FILENAME=/etc/hosts

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

echo $FILENAME
Function
echo $FILENAME

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

Ultimo a cura di hegemaro; al 02/03/2007 10:41 AM..
  #5 (permalink)  
Old 02-03-2007
malle malle is offline
Utente Registrato
  
 

Iscriviti Data: gennaio 2007
Località: Kolkata
Interventi: 10
Grazie zazzybob. La soluzione è stata fantastica.

Grazie a tutti coloro che hanno dato un po 'di suggerimenti in merito alla soluzione.
Closed Thread

Segnalibri

Thread Tools Cerca in questo Thread
Cerca in questo Thread:

Ricerca Avanzata
Modalità di visualizzazione Vota questo thread
Vota questo thread:

Distacco regolamento
Tu non può post nuovo thread
Tu non può inviare una risposta
Tu non può postare allegati
Tu non può modificare i tuoi post

BB codice è Su
Smilies sono Su
[IMG] codice Su
Codice HTML è Chiuso
Trackbacks sono Su
Pingbacks sono Su
Refbacks sono Su




Tutti gli orari sono GMT -4. La data di oggi è 04:20 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Traduzioni Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
UNIX e Linux Forum Content Copyright © 1993-2009. Tutti i diritti Reserved.Ad di gestione da RedTyger

Contenuti pertinenti URL da vBSEO 3.2.0