die bash, find und die wildcards

Dieses Thema: "die bash, find und die wildcards" im Forum "Shell-Skripte" wurde erstellt von toto, 20.01.2004.

  1. toto

    toto Grünschnabel

    Dabei seit:
    20.01.2004
    Beiträge:
    6
    Zustimmungen:
    0
    Ort:
    germany
    hi...
    ich bin neu an der bash, deswegen habt rücksicht :D

    mein problem ist folgendes:
    ich habe ein kleines skript, indem ich die ausgabe eines find-kommandos durchgehe und aktionen veranlasse.
    das kommandozeilenargument ist dabei das muster, mit dem "find" sucht.

    konkret (skript rmrec)
    ----------------
    #!/bin/bash
    pattern=$1

    for i in `find -name $pattern`; do
    rm -f $i
    done
    -----------------

    das "find" wie es oben steht funktioniert an der kommandozeile selbst wunderbar. mir ist es wichtig, die unterverzeichnisse auch mitzunehmen, deswegen "find". das problem ist das sichern des kommandozeilenarguments in "$1",
    wenn die wildcard "*" benutzt wird, etwa wenn ich das skript aufrufe mit "rmrec wurst*"
    wenn ich $1 ausgebe, ist $1 lediglich das alphabetisch erste element aller elemente, bspw wäre es "wurstbrot", auch wenn es noch die dateien "wurstkoffer" und "wurststulle" gibt. :D
    der rest wird gar nicht mitgenommen !
    wie kann ich das direkte auswerten der wildcard verhindern ?

    habs hiermit probiert:
    for i in ''`find -name '*''$pattern''*'`;do...
    funzt nicht !
    danke für die hilfe !
    chao
     
  2. Anzeige

    Schau dir mal diesen Ratgeber an. Viele Antworten inkl. passender Shell-Befehle!
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. toto

    toto Grünschnabel

    Dabei seit:
    20.01.2004
    Beiträge:
    6
    Zustimmungen:
    0
    Ort:
    germany
    nachtrag

    sorry hatte was vergessen:

    wenn ich das skript mit bspw
    "rmrec 'wurst*' " aufrufe findet "find" tatsächlich alle einträge...aber geht nicht in die subdirectories..!!!

    weiss jemand warum und wie man dem abhelfen kann ?

    dange
    toto
     
  4. rup

    rup Haudegen

    Dabei seit:
    10.04.2002
    Beiträge:
    627
    Zustimmungen:
    0
    So sollte es gehen:

    Code:
     
    #!/bin/bash 
    
    find . -name "$1" -exec rm -f {} \;
    
     
  5. toto

    toto Grünschnabel

    Dabei seit:
    20.01.2004
    Beiträge:
    6
    Zustimmungen:
    0
    Ort:
    germany
    hallo rup
    danke erstmal !
    diese zeile produziert allerdings genau das gleiche problem: "find" findet nur das alphabetisch nächste Element , löscht also nach dem "element1" nur das "element2" usw.

    wieso is das eigentlich so ? kann mir das jemand kurz erklären ?
    danke
    toto
     
  6. tr0nix

    tr0nix der-mit-dem-tux-tanzt

    Dabei seit:
    11.07.2003
    Beiträge:
    1.585
    Zustimmungen:
    0
    Ort:
    Schweiz, Opfikon/Glattbrugg
    Ich vestehe dein Problem nicht ganz. Wie meinst du das mit "Alphabetisch"? Wie willst dus denn?

    BTW. ich wuerde das nicht als Script machen sondern selbst eintippen. Ist IMHO zu heiss wenn dus als root ausfuehrst!
     
  7. toto

    toto Grünschnabel

    Dabei seit:
    20.01.2004
    Beiträge:
    6
    Zustimmungen:
    0
    Ort:
    germany
    hallo !

    mit alphabetisch meine ich : das element was im alphabet als nächstes kommen würde- nach "element2" kommt "element3" und bspw nicht "element7".
    das ist allerdings nicht das problem !
    das problem ist, das wenn man das skript ausführt, dieses nur _ein_ Element löscht.
    z.B:

    es existieren die Dateien

    elt1, elt2, elt3, elt4

    das skript würde ausgeführt mit dem argument "el*" nur "elt1" löschen, allerdings nicht die übrigen dateien, obwohl sie das suchmuster "matchen".

    warum ?
    rätselt
    toto
     
  8. tr0nix

    tr0nix der-mit-dem-tux-tanzt

    Dabei seit:
    11.07.2003
    Beiträge:
    1.585
    Zustimmungen:
    0
    Ort:
    Schweiz, Opfikon/Glattbrugg
    Mh ich koennts mir denken!

    Mach mal ein echo auf $1 im Script. Moeglicherweise macht die Shell bereits eine Substitution auf die Wildcard (sollte ja eigentlich durch die ' vermieden werden, aber mach trotzdem mal).

    Greetz
    Joel
     
  9. toto

    toto Grünschnabel

    Dabei seit:
    20.01.2004
    Beiträge:
    6
    Zustimmungen:
    0
    Ort:
    germany
    hi tr0nix...
    ja, das ist auch so...das habe ich bereits getestet, die shell wertet schon das $1 aus !
    wie kann man das verhindern, ausser das argument in ' hochkommata ' zu setzen ?

    bzw. wenn man soweit ist, geht "find" nur im aktuellen verzeichnis umher... und nicht in den unterverzeichnissen...woran liegt das ?

    danke
    toto
     
  10. rup

    rup Haudegen

    Dabei seit:
    10.04.2002
    Beiträge:
    627
    Zustimmungen:
    0
    Wie man das verhindern kann faellt mir gerade nicht ein, bin bisher nie auf das Problem gestossen. Bis zu einer gewissen Anzahl von Argumenten hilft folgendes:



    #!/bin/bash

    while [ $# -gt 0 ]
    do
    rm -f $1
    shift
    done
     
  11. Yuuhi

    Yuuhi Jungspund

    Dabei seit:
    21.01.2004
    Beiträge:
    22
    Zustimmungen:
    0
    Tjoar, hast wohl nur die 2 Moeglichkeiten das Argument entweder in ' ' zu setzen oder eventuelle wildcards mit \ zu escapen, wogegen eigentlich auch nichts sprechen sollte, oder?

    Alternativ kann es auch noch sein, dass deine Shell vielleicht noch die Moeglichkeit bietet das globbing abzuschalten.

    [0]benni@sehanine:~/src/shell% ls tm*
    tmp
    [0]benni@sehanine:~/src/shell% setopt noglob
    [0]benni@sehanine:~/src/shell% ls tm*
    ls: tm*: No such file or directory

    Das koenntest du aber natuerlich nicht im Script machen, sondern nur in der Shell, wo du es aufrufst.

    find sollte uebrigens eigentlich auch in den Unterverzeichnissen suchen, bei welchem konkreten Aufruf hast du das Problem?

    mfg,

    Yuuhi
     
  12. toto

    toto Grünschnabel

    Dabei seit:
    20.01.2004
    Beiträge:
    6
    Zustimmungen:
    0
    Ort:
    germany
    hi yuuhi,
    danke für den beitrag.

    der find-aufruf funktioniert, wenn ich ihn von der shell aus aufrufe; er funktioniert auch, wenn ich ihn im skript aufrufe , aber nicht, wenn ich ihm das kommandozeilenargument übergebe, sprich $1.
    setze ich $1 im aufruf in hochkommata, findet "find" zumindest mehr als das nächste element (siehe oben).
    aber dann geht "find" stumpf _nicht_ in die unterverzeichnisse! ich finde das sehr merkwürdig !
    kennt noch jemand das problem ?

    soweit deine frage ?
    mfG
    toto
     
  13. Yuuhi

    Yuuhi Jungspund

    Dabei seit:
    21.01.2004
    Beiträge:
    22
    Zustimmungen:
    0
    Was ich gerne gehabt haette, waere genau das Skript mit dem du aktuell das Problem hast. Etwas, dass ich hier selber testen kann, um das Problem nachzuvollziehen.

    Ich kann natuerlich meine Glaskugel rausholen und versuchen zu erraten was das Problem ist.

    Experementieren wir halt mal ein wenig mit find, um dein Problem zu verstehen...
    Nehmen wir dazu dieses Skript, das genau das von dir beschriebene Verhalten hat:

    #!/bin/bash

    pattern=$1
    find $pattern


    [0]benni@sehanine:~/texte% ./blubb.sh a*
    adsl

    [0]benni@sehanine:~/texte% ./blubb.sh "a*"
    adsl
    ailesgrises.pdf
    aoapdf.tar.gz

    Das ist genau das von dir beschriebene Verhalten. Nur woran liegt das?
    Beim ersten Aufruf loest die Shell die Wildcard sofort auf. Damit landet in $1 nur der _erste Dateiname_ und nicht das Pattern. Damit kommt bei find nur der Dateiname an und wird auch gefunden.

    Beim zweiten Mal ueberlebt es das Pattern immerhin bis in das Skript... es wird aber vor dem Aufruf von find aufgeloest. find datei1 datei2 datei3 findet dann genau die 3 Dateien und geht nicht in Unterverzeichnisse.
    Korrekt sollte das ganze also so aussehen:

    #!/bin/sh

    pattern=$1 (wenn man das denn unbedingt will...)
    find . -name "$pattern"

    Damit sollte es dann keine solchen Probleme geben.

    Mata ne,

    Yuuhi
     
Thema:

die bash, find und die wildcards

Die Seite wird geladen...

die bash, find und die wildcards - Ähnliche Themen

  1. Kann .bashrc nicht finden

    Kann .bashrc nicht finden: Hi, ich nutze FreeBSD 6.3 und die Bash. Wollte mal nen paar Aliase eintragen, kann aber meine .bashrc nicht finden. In meinem Homeverzeichnis...
  2. bash Finden und Löschen aller leeren Verzeichnisse

    bash Finden und Löschen aller leeren Verzeichnisse: Mit find . */ -exec rmdir "{}" ";"findet und loescht man alle leeren Verzeichnisse ab der Ebene wo man sich gerade befindet. Allerdings werden...
  3. Bashscript aus Debian6 läuft nicht auf Debian7

    Bashscript aus Debian6 läuft nicht auf Debian7: Hallo an alle, nachdem ich ein Skript von squeeze auf wheezy kopiert habe und ausführte, erschienen gleich wilde Fehlermeldungen, nach denen ich...
  4. Bash sucht neues Logo

    Bash sucht neues Logo: Die GNU Bourne Again Shell (bash) sucht nach knapp 20 Jahren ein neues, individuelles Logo. Alle Anwender und Interessenten sind deshalb...
  5. Mit bash Skript bestimmte Werte aus Tabelle lesen

    Mit bash Skript bestimmte Werte aus Tabelle lesen: Hallo! Ich beschäftige mich erst seit Kurzem mit bash und bin deshalb noch nicht so fit darin. Und nun habe ich schon ein kleines Problem und...