Toon posts:

[Bash] Recursief script

Pagina: 1
Acties:

Verwijderd

Topicstarter
Helaas geen code tag voor beschikbaar of ik ben scheel 8)7 mjah op naar mijn probleem :P
Ik probeer alles uit te printen met ls van de dir die je meegeeft $1 dus en als het script een dir in deze dir tegenkomt moet hij zichzelf weer aanroepen alleen dan met de parameter van die dir dus dat ook alle subdirectories uitgeprint worden. Mijn script heet bu en zit in ~/bin/ ik heb gekeken of .bashrc goed was en path staat goed ingesteld ik kan in mijn script bv mn home dir invoeren maar hij print dan alleen alles in die dir uit hij gaat niet verder naar mijn sub directories en ik heb dus geen idee waarom hij dat niet doet ;( Ik hoop dat iemand mij kan helpen _/-\o_

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#/bin/bash
IFS=$'\n';
 
for file in `ls "$1"`
do
    if test -f $file
     then
      echo "F $(pwd)/$file" ;
    fi
    if test -d $file
     then
          echo "D $(pwd)/$file" ;
      bu "$(pwd)/$file";  
    fi
done

[ Voor 0% gewijzigd door een moderator op 18-12-2007 20:32 . Reden: code tags ]


  • mithras
  • Registratie: Maart 2003
  • Niet online
Waarom doe je niet
ls --recursive
:?

  • laurxp
  • Registratie: April 2005
  • Laatst online: 27-01 18:23
ls -R?
zie de Manpages

Verwijderd

Topicstarter
Uh jah dat had ik al geprobeerd maar dat werkte ook niet :S ik heb nu dit maar ik krijg nog steeds alleen maar de contents van de dir die ik invoer en niet van de subdir's
#/bin/bash
IFS=$'\n';

for file in `ls -R "$1"`
do
if test -f $file
then
echo "F $(pwd)/$file" ;
fi
if test -d $file
then
echo "D $(pwd)/$file" ;
fi
done

  • Bob
  • Registratie: Mei 2005
  • Laatst online: 20:45

Bob

Als ls -R niet werkt dan denk ik dat je een bug hebt ontdekt in ls, maar dat lijkt me heeeeel onwaarschijnlijk. :) Ben je er zeker van dat ls -R niet werkt? Wat is de output dan wel?

  • mithras
  • Registratie: Maart 2003
  • Niet online
Je moet ook niet een bash recursive script gaan schrijven die een recursive functie gebruikt. Gebruik gewoon ls -R of ls --recursive in je shell, niet in je script. ls -R zal recursief je mappen afgaan en alles printen :)

  • benoni
  • Registratie: November 2003
  • Niet online
Dit script doet ook iets met de uitvoer van ls, maar dan voert ie de lijst aan AWK, met een resultaat wat heel erg lijkt op wat je wilt hebben (als ik 't zo even snel bekijk):
benoni in "Het grote "handige scripts" topic"
Maar 't kan wellicht ook simpeler, omgekeerd evenredig aan hoe flexibel je de output wilt hebben, zie de opmerkingen onder het gelinkte script.

Als je recursief wilt scripten dan kun je ook de loop in een functieblok plaatsen, dat is op zich wel mogelijk in shellscripts, maar je ziet 't niet zoveel...

Stijlmodelletje:
Bash:
1
2
3
4
5
6
7
8
9
10
11
12
functieblokje()
{
    echo "Parameter = "
    echo $1
}

# Aanroep:
functieblokje "parameter"

# Of zo:
parameter="zoiets"
feedback=`functieblokje "$parameter"`

[ Voor 29% gewijzigd door benoni op 18-12-2007 20:17 ]


  • RemcoDelft
  • Registratie: April 2002
  • Laatst online: 28-01 18:26
Is `du` of `find` niet meer wat je zoekt?

Verwijderd

Topicstarter
uh jah ik heb geen idee meer ik heb echt van alles geprobeerd het lijkt zo simpel maar ik mis gewoon iets ofzo :S ik snap gewoon niet waarom bu "$(pwd)/$file"; niet werkt hij print niks uit van wat in die subdir zit :S


--Edit-- Hoo wacht is even misschien is dit iets als ik in mijn home dir zit en ik roep bu met mijn home dir aan dan print hij die inhoud. In mijn home dir zit een submap Examples als ik dan die probeer in te voeren print hij ook niks uit maar als ik dan met cd naar mijn Examples map ga en dan met bu die examples map erin doe print hij het wel uit ik denk dat hier iets mis is maar dan heb ik nu dus echt geen idee meer wat er mis is misschien dan toch iets met mijn .bashrc file?

[ Voor 52% gewijzigd door Verwijderd op 18-12-2007 20:06 ]


  • benoni
  • Registratie: November 2003
  • Niet online
Is het dat je spaties of gekke tekens in de namen hebt, en dat deze verloren gaan bij het doorgeven als parameter? Dan moet je zien te escapen of te quoten...

  • F_J_K
  • Registratie: Juni 2001
  • Niet online

F_J_K

Moderator CSA/PB

Front verplichte underscores

offtopic:
Even de scheelheid gecorrigeerd zodat de boel duidelijker leesbaar is :+ En inderdaad doet [cmd] het ook prima.

'Multiple exclamation marks,' he went on, shaking his head, 'are a sure sign of a diseased mind' (Terry Pratchett, Eric)


Verwijderd

Topicstarter
hmmzz nee gekke tekens :S en met dat functieblokje is dat niet een beetje een omweg nu ik roep gewoon mijn script opnieuw aan dus dat zou eigenlijk hetzelfde moeten zijn nu toch? Want ik kan gewoon alle commando's aanroepen dus ook mijn script bu vandaar de recursie maar die werkt helaas niet zoals hij hoort te werken en ik vind het raar dat:

Hoo wacht is even misschien is dit iets als ik in mijn home dir zit en ik roep bu met mijn home dir aan dan print hij die inhoud. In mijn home dir zit een submap Examples als ik dan die probeer in te voeren print hij ook niks uit maar als ik dan met cd naar mijn Examples map ga en dan met bu die examples map erin doe print hij het wel uit.

Maar in iedergeval bedankt voor jullie hulp :)

  • benoni
  • Registratie: November 2003
  • Niet online
Verwijderd schreef op dinsdag 18 december 2007 @ 20:49:
Hoo wacht is even misschien is dit iets als ik in mijn home dir zit en ik roep bu met mijn home dir aan dan print hij die inhoud. In mijn home dir zit een submap Examples als ik dan die probeer in te voeren print hij ook niks uit maar als ik dan met cd naar mijn Examples map ga en dan met bu die examples map erin doe print hij het wel uit.
Dan moet je eens absolute paden proberen mee te geven ('/home/blah/blahblah') in plaats van relatieve ('blah/blahblah')...

Verwijderd

Topicstarter
dat is het probleem ik geef de heletijd het absolute pad mee :(

even ter verduidelijking: ik zit in mijn home dir dan typ ik bu /home/chino en dat werkt gewoon behalve dat hij dan die subdirs niet ingaat maar als ik dan nu bu /home/chino/Examples intyp doet hij het niet print gewoon niks uit dus vervolgens doe ik cd Examples en probeer dan nog een keer bu /home/chino/Examples dan print hij wel alles in die map uit :S 8)7 |:(

[ Voor 74% gewijzigd door Verwijderd op 18-12-2007 21:08 ]


  • RemcoDelft
  • Registratie: April 2002
  • Laatst online: 28-01 18:26
Laat je script eens "echo" doen i.p.v. "bu"... Dan zie je of daar iets mis gaat.

Verwijderd

Topicstarter
ook geprobeerd dan krijg ik dus bu /home/chino/submapnaam dus dat zou goed moeten gaan het probleem is dan dat hij gewoon niks print uit die submap wat ik dus heel erg raar vind :S

  • benoni
  • Registratie: November 2003
  • Niet online
Ah, '$(pwd)' is altijd het huidige pad van de gebruiker:
Het pwd commando (print working directory) geeft op de Unix-familie van besturingssystemen de naam van de huidige werkdirectory weer
Je moet dus cd'en naar de submap, of geen pwd gebruiken.

En test ook met spaties en vreemde tekens in de bestandsnamen, ik zeg dat niet voor niets escapen of quoten B) :P

Gebruik bijvoorbeeld deze:
code:
1
ls --escape "$1"


of desnoods zoiets:
code:
1
bu "$path/\"$file\"";


Voorbeeldje O-)
Bash:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#/bin/sh
IFS=$'\n';

listfiles () {
    path=$1
    for file in `ls --escape "$path"`
    do
        if test -f $path/$file
        then
            echo "F $path/$file" ;
        fi
        if test -d $path/$file
        then
            echo "D $path/$file";
            listfiles "$path/$file";
        fi
    done
}

listfiles $1

[ Voor 68% gewijzigd door benoni op 18-12-2007 22:36 ]


Verwijderd

Topicstarter
#/bin/bash
IFS=$'\n';
 
for file in `ls "$1"`
do
    cd $1;
    if test -f $file
     then
      echo "F $(pwd)/$file" ;
    fi
    if test -d $file
     then
          echo "D $(pwd)/$file" ;
          cd "$(pwd)/$file";
	  bu  "$(pwd)";
    fi
done


Het werkt!!!!!!!! _/-\o_ _/-\o_ _/-\o_ bedankt allemaal :)

  • laurencevde
  • Registratie: November 2001
  • Laatst online: 02-10-2025
Lekker traag en geheugenslurpend scriptje als je een hele hoop (sub)mappen hebt.
Door elke keer weer "bu" aan te roepen start je elke keer weer een nieuw bash-proces, wat nou niet bepaald resource-vriendelijk is...
Daanaast is het een beetje nutteloos om bij elke iteratie naar dezelfde map te cd-en. Dat kun je net zo goed 1x doen voordat je de for-loop ingaat.

Have a taste of freedom. It is sometimes a bitter pill. To me though, this is the sweetness of the GPL

Pagina: 1