The UNIX and Linux Forums  
Hallo und herzlich Willkommen aus den Vereinigten Staaten, die UNIX-und Linux-Foren! Vielen Dank für Ihren Besuch und die Teilnahme an unserem Global Community.

Go Back   Die UNIX-und Linux-Foren > Top Foren > Shell Programmierung und Scripting
.
Google unix.com



Shell Programmierung und Scripting Post Fragen zu ksh, csh, sh, bash, Perl, PHP, sed, awk und anderen Shell-Skripte und Shell-Scripting-Sprachen hier.

Mehr UNIX-und Linux-Forum Themen Vielleicht finden Sie hilfreiche
Faden Thread Starter Forum Antworten Last Post
Mail-Funktion Problem jwholey Shell Programmierung und Scripting 4 05-01-2008 12:21 PM
Script-Problem durch rekursive Verzeichnisse Hilfe wenden Sie sich bitte robertmcol Shell Programmierung und Scripting 2 04-27-2008 08:00 PM
Funktion Problem-und coredump Zingaro Shell Programmierung und Scripting 8 02-19-2008 06:37 PM
rekursive Funktion bebop1111116 High-Level-Programmierung 1 10-30-2006 08:12 PM
PERL Funktion Problem avadhani Shell Programmierung und Scripting 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 Suche diesen Thread Rate Thread Anzeige-Modi
  #1 (permalink)  
Old 02-03-2007
malle malle is offline
Registrierte Nutzer
  
 

Join Date: Jan 2007
Ort: Kolkata
Beiträge: 10
Problem mit Rekursive Funktion

Hi all,

Ich habe, um alle Dateien in einem Verzeichnis-Baum, an einem einzigen Verzeichnis. Inorder zu wissen, welche Datei aus dem Verzeichnis, werde ich haben, um den Namen des Verzeichnisses dem Namen der Datei. Für diese habe ich eine rekursive Funktion, die sich wie folgt
---------------------------------------------
datamover ()
(
cd $ 1
# OLD_DIR \u003d $ 2
for i in *
tun
if [-d $ i]
dann
TMP_DIR \u003d $ i
datamover $ TMP_DIR
echo $ i
sonst
mv $ i .. / $ 1_ $ i

if [-f $ 1 /]
dann
echo Dateien noch vorhanden
sonst
cd ..
rmdir $ 1
fi

fi
getan
)
-------------------------------------------------- --------------
Wann immer ich die gleiche Ausführung auf eine Verzeichnis-Struktur als
DIRA -> DirB -> DirL -> filen
-> DirM -> fileO
---> DIRC -> DIRP -> Filer
-> DirQ -> Dateien

das Programm gibt die Ausgabe wie folgt
DIRA -> DirB -> DirL_fileN
-> DirM_fileO
---> DIRC -> DIRP -> Filer
-> DirQ -> Dateien

und die Debug-ouptut ist wie folgt
-------------------------------------------------- ----
Echo + R Name ist DIRA
R Name ist 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 ']'
+ DIRC mv .. / DirA_DirC
mv: cannot stat `DIRC": Keine solche Datei oder ein Verzeichnis
+ '['-F DIRA / ']'
+ Cd ..
+ Rmdir DIRA
rmdir: `DIRA": Keine solche Datei oder ein Verzeichnis
-------------------------------------------------- ------------

Kann jemand mir sagen, weiss ist das Problem mit dem Code, und wie, um es zu korrigieren?
Ich benötige die Ausgabe in diesem Szenario wird als
DIRA -> DirB_DirL_fileN
-> DirB_DirM_fileO
-> DirC_DirP_fileR
-> DirC_DirQ_fileS

Vielen Dank im Voraus
  #2 (permalink)  
Old 02-03-2007
zazzybob's Avatar
zazzybob zazzybob is offline Forum Advisor  
Registriert Geek
  
 

Join Date: Dezember 2003
Ort: Melbourne, Australien
Beiträge: 2.100
Hier ist eine einfache Ausgangspunkt ....
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
Wie Sie sehen können, werden alle Dateien aus DIRA auf Zielordner.

Sie können dann einfach rm-rf DIRA

Prost
ZB
  #3 (permalink)  
Old 02-03-2007
sb008 sb008 is offline Forum Advisor  
Registrierte Nutzer
  
 

Join Date: Jan 2007
Beiträge: 384
Zitat:
Zitat von zazzybob
Hier ist eine einfache Ausgangspunkt ....
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
Wie Sie sehen können, werden alle Dateien aus DIRA auf Zielordner.

Sie können dann einfach rm-rf DIRA


Prost
ZB
Dies ist die Art und Weise zu tun.

Das Original-Skript nicht, weil der
for i in *
Aussage

Die mit * wird am Anfang der Funktion und geht nicht davon aus auf Dateien in diesem Verzeichnis aus einem Unterverzeichnis.
  #4 (permalink)  
Old 02-03-2007
hegemaro hegemaro is offline
Registrierte Nutzer
  
 

Join Date: Feb 2006
Ort: Schenectady, NY
Beiträge: 134
Arrow

zazzybob-Lösung ist eine elegante und einfache Lösung.

Als Reaktion auf Rekursion in einer Korn-Shell-Funktion gibt es zwei Punkte zu beachten. Alle Variablen, einschließlich der aktuellen Arbeitsverzeichnis, sind global, es sei denn, die mit der Funktion, die sie dann vor Ort in der Funktion.
Code:
typeset FILENAME=/etc/hosts

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

echo $FILENAME
Function
echo $FILENAME
würde

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

Jedoch,

Code:
typeset FILENAME=/etc/hosts

Function ()
{
    typeset FILENAME

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

echo $FILENAME
Function
echo $FILENAME
würde
/ etc / hosts
/ etc / resolv.conf
/ etc / hosts

Eine schnelle und schmutzige Art und Weise, um lokale Variablen der Funktion einschließlich der Arbeitsweise der Dienststellen ist für die Ausführung der Funktion in ihrer eigenen Schale durch Klammern in der Funktion Klammern. Die Funktion wird eine eigene Kopie der Umwelt, wenn sie und alle Änderungen, einschließlich des Verzeichnisses, in dieser Umgebung werden nicht in das aufrufende Skript, das seine eigene Funktion.

Code:
typeset FILENAME=/etc/hosts

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

echo $FILENAME
Function
echo $FILENAME
würde
/ etc / hosts
/ etc / resolv.conf
/ etc / hosts

Zuletzt bearbeitet von hegemaro; am 02-03-2007 10:41 AM..
  #5 (permalink)  
Old 02-03-2007
malle malle is offline
Registrierte Nutzer
  
 

Join Date: Jan 2007
Ort: Kolkata
Beiträge: 10
Dank zazzybob. Die Lösung war fantastisch.

Vielen Dank an alle, hat einige weitere Hinweise über die Lösung.
Closed Thread

Lesezeichen

Thread Tools Suche diesen Thread
Suche diesen Thread:

Erweiterte Suche
Anzeige-Modi Rate this thread
Rate this thread:

Forumregeln
Du möglicherweise nicht neue Themen
Du möglicherweise nicht nach Antworten
Du möglicherweise nicht post-Anlagen
Du möglicherweise nicht bearbeiten Sie Ihre Beiträge

BB-Code ist Auf
Smilies sind Auf
[IMG] Code Auf
HTML-Code ist Aus
Trackbacks sind Auf
Pingbacks sind Auf
Refbacks sind Auf




Alle Zeiten sind GMT -4. Es ist jetzt 11:20 AM.


Powered by: vBulletin, Copyright © 2000 - 2006, Jelsoft Enterprises Ltd. Sprachliche Übersetzungen Powered by .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
Die UNIX-und Linux-Foren Content © Copyright 1993-2009. Alle Rechte Reserved.Ad Management von RedTyger

Content Relevant URLs durch vBSEO 3.2.0