The UNIX and Linux Forums  

Go Back   O UNIX e Linux Forum > Top Fóruns > Programação Shell Script e
.
google unix.com



Programação Shell Script e Post perguntas sobre ksh, CSH, SH, BASH, Perl, PHP, SED, Awk e outros scripts shell e shell scripts línguas aqui.

Mais UNIX e Linux Fórum Tópicos Você pode achar Helpfull
Fio Thread Starter Fórum Respostas Última postagem
mail função problema jwholey Programação Shell Script e 4 05-01-2008 12:21
Script problema devido ao recursivas diretórios Ajuda por favor robertmcol Programação Shell Script e 2 04-27-2008 08:00
Função Problema e coredump Zingaro Programação Shell Script e 8 02-19-2008 06:37
função recursiva bebop1111116 Alto Nível de programação 1 10-30-2006 08:12
PERL função problema avadhani Programação Shell Script e 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 Pesquisar este Thread Rate Thread Display Modes
  #1 (permalink)  
Old 02-03-2007
malle malle is offline
Usuário
  
 

Join Date: Jan 2007
Localização: Kolkata
Lugares: 10
Problema com função Recursiva

Oi tudo,

Tenho que passar todos os arquivos em uma árvore diretório estrutura para um único diretório. Inorder para saber qual arquivo é a partir do qual diretório, vou ter de adicionar o nome do diretório com o nome de arquivo. Por isso eu escrevi uma função recursiva que é o seguinte
---------------------------------------------
datamover ()
(
cd $ 1
# OLD_DIR \u003d $ 2
for i in *
fazer
if [-d $ i]
então
TMP_DIR $ i \u003d
datamover $ TMP_DIR
echo $ i
diferente
mv $ i .. / $ 1_ $ i

if [-f $ 1 /]
então
echo alguns ficheiros ainda existem
diferente
cd ..
rmdir $ 1
fi

fi
feito
)
-------------------------------------------------- --------------
Quando eu nunca executar o mesmo em uma estrutura de diretório como
DIRA -> DirB -> DirL -> filen
-> DirM -> fileO
---> DirC -> DirP -> filer
-> DirQ -> arquivos

o programa está dando o resultado como segue
DIRA -> DirB -> DirL_fileN
-> DirM_fileO
---> DirC -> DirP -> filer
-> DirQ -> arquivos

e de depuração ouptut é o seguinte
-------------------------------------------------- ----
+ Echo Dir Nome é DIRA
Dir Nome é 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 ']'
+ Mv filen .. / DirL_fileN
+ '['-F DirL / ']'
+ Cd ..
+ Rmdir DirL
+ Echo filen
filen
+ '[' DirM-d ']'
+ TMP_DIR \u003d DirM
+ Datamover DirM
+ Cd DirM
+ '[' FileO-d ']'
+ Mv fileO .. / DirM_fileO
+ '['-F DirM / ']'
+ Cd ..
+ Rmdir DirM
+ Echo fileO
fileO
+ Echo fileO
fileO
+ '[' DirC-d ']'
+ Mv DirC .. / DirA_DirC
mv: cannot stat `DirC ': Nenhum tal lima ou diretório
+ '['-F DIRA / ']'
+ Cd ..
+ Rmdir DIRA
rmdir: `dira ': Nenhum tal lima ou diretório
-------------------------------------------------- ------------

Alguém pode me dizer WHT é o problema com o código e como corrigi-lo?
i exigir a saída, neste cenário, será a
DIRA -> DirB_DirL_fileN
-> DirB_DirM_fileO
-> DirC_DirP_fileR
-> DirC_DirQ_fileS

Thanks in Advance
  #2 (permalink)  
Old 02-03-2007
zazzybob's Avatar
zazzybob zazzybob is offline Forum Advisor  
Registrado Geek
  
 

Join Data: dezembro 2003
Localização: Melbourne, Austrália
Posts: 2.100
Aqui está um simples ponto ....

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 você pode ver, todos os arquivos são movidos a partir de destdir dira.

Você pode, então, apenas rm-rf dira

Felicidades
ZB
  #3 (permalink)  
Old 02-03-2007
sb008 sb008 is offline Forum Advisor  
Usuário
  
 

Join Date: Jan 2007
Posts: 384
Citação:
Originally Posted by zazzybob
Aqui está um simples ponto ....

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 você pode ver, todos os arquivos são movidos a partir de destdir dira.

Você pode, então, apenas rm-rf dira


Felicidades
ZB
Essa é a maneira de fazê-lo.

O original script falhar devido à
for i in *
declaração

A * é avaliada no início da função e não antecipar em arquivos movidos para o directório de um subdirectório.
  #4 (permalink)  
Old 02-03-2007
hegemaro hegemaro is offline
Usuário
  
 

Join Date: Feb 2006
Location: Schenectady, NY
Lugares: 134
Arrow

zazzybob da solução é uma solução simples e elegante.

Em resposta a recursão Korn shell dentro de uma função, existem dois pontos a considerar. Todas as variáveis, incluindo o atual diretório de trabalho, são globais, salvo se especificamente definidas com a função que, em seguida, torna-os locais dentro da função.

Código:
typeset FILENAME=/etc/hosts

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

echo $FILENAME
Function
echo $FILENAME

iria produzir

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

Contudo,


Código:
typeset FILENAME=/etc/hosts

Function ()
{
    typeset FILENAME

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

echo $FILENAME
Function
echo $FILENAME

iria produzir
/ etc / hosts
/ etc / resolv.conf
/ etc / hosts

Uma maneira rápida e suja variáveis locais para fazer a função INCLUINDO o diretório está trabalhando para executar a função no seu próprio reservatório, colocando parêntesis dentro da função entre parênteses. A função vai ficar a sua própria cópia do ambiente quando chamado e eventuais alterações, incluindo o diretório, para que o ambiente não será refletida na chamada script que faz a sua própria função.


Código:
typeset FILENAME=/etc/hosts

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

echo $FILENAME
Function
echo $FILENAME

iria produzir
/ etc / hosts
/ etc / resolv.conf
/ etc / hosts

Última edição por hegemaro; em 02/03/2007 10:41..
  #5 (permalink)  
Old 02-03-2007
malle malle is offline
Usuário
  
 

Join Date: Jan 2007
Localização: Kolkata
Lugares: 10
Graças zazzybob. A solução foi fantástico.

Agradecemos a todos que tem dado um pouco mais dicas sobre a solução.
Closed Thread

Marcadores

Thread Tools Pesquisar este Thread
Pesquisar este Thread:

Pesquisa Avançada
Display Modes Esta taxa Thread
Esta taxa Thread:

Destacamento Regimento
Você não pode postar novas threads
Você não pode postar respostas
Você não pode postar anexos
Você não pode editar suas postagens

BB code é Ligado
Smilies são Ligado
[IMG] código é Ligado
Código HTML é Desligado
Trackbacks são Ligado
Pingbacks são Ligado
Refbacks são Ligado




Todos os horários são GMT -4. A hora é agora 03:46.


Powered by: vBulletinCopyright © 2000 - 2006, Jelsoft Enterprises Limited. Língua Traduções Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
O UNIX e Linux Fóruns Content Copyright © 1993-2009. Todos os Direitos Reserved.Ad Gestão por RedTyger

Content Relevant URLs por vBSEO 3.2.0