Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Dateien durchsuchen und ggf. bei Erfolg verschieben?

  1. #1
    Registrierter Benutzer
    Registriert seit
    08.01.2001
    Beiträge
    242

    Question Dateien durchsuchen und ggf. bei Erfolg verschieben?

    Hallo,

    ich möchte regelmäßig ein paar Verzeichnisse nach dateien mit bestimmten Inhalten durchsuchen und bei erfolgreicher Suche die betroffenen Dateien Verschieben.
    hab dafür folgenden ansatz:

    Code:
    #!/bin/sh
    
    # Pfad zu Datei mit den Suchbegriffen
    SEARCH_DB=`cat /home/samba/search/search_db`
    
    # Pfad zum Ordner wo die Dateien mit den Suchbegriffen hinkommen
    DIR="/home/samba/search/tmp"
    
    # Pfad zu den Dateien die durchsucht werden sollen (dort gibts keine 
    # weitern Unterverzeichnisse)
    SEARCH_DIRS="/home/andi/files
    /home/tom/files
    /home/user1/files
    /home/samba/wg"
    
    
    for i in $SEARCH_DIRS; do
    
     cd $i          # ins entspr. Verz. wechseln
     
     set `du`       # kucken ob verzeichnis leer ist, was dann mit dem "test"
     		# ausgewertet wird (ist mir nix besseres eingefallen)
     
     if [! "$1" = "4" ]; then
      
      CHECK_FILES=`ls -1 | tail -2` # vorhandenen FIles in $CHECK_FILES packen
      
      for x in $CHECK_FILES; do
       
       for y in $SEARCH_DB: do
         
         # hier weis ich dann nicht weiter:
         # kucken ob in den Datein in $CHECK_FILES 
         # die suchbegriffe aus $SEARCH_DB sind, wenn ja
         # die dann nach $DIR moven
         # so ala "grep $y $x, wenn ok, mv $x $DIR wenn nicht OK dann
         # halt den naechsten begriff
       done
      
      done 
     
     fi
    
    done
      
    exit 0

    kann mir da jemand weiterhelfen???

    der tom

  2. #2
    Registrierter Benutzer
    Registriert seit
    25.12.1999
    Ort
    Stuttgart
    Beiträge
    259
    Hi,

    schau mal, ob das hier macht, was Du willst ( zum Testen kannst Du Zeile 18 (mv....) auskommentieren):

    Code:
    #!/bin/sh
    
    SEARCH_DB="/home/micha/development/scripts/samba/search_db"
    SEARCH_DIRS="/home/micha/development/scripts/samba/home/user1/
    /home/micha/development/scripts/samba/home/user2/"
    DEST_DIR="/home/micha/development/scripts/samba/tmp"
    
    for user in $SEARCH_DIRS
      do
      echo "Searching in $user..."
      while read regex
        do
        echo "Searching for $regex..."
        for file in `grep -R "$regex" $user | cut -d ':' -f -1`
          do
          name=`basename $file`
          echo "Moving $file to $DEST_DIR/$name"
          mv $file $DEST_DIR/$name
        done
      done < $SEARCH_DB
    done
    
    exit 0
    Gruß micha
    IRC: irc.euirc.net #tux

  3. #3
    Registrierter Benutzer
    Registriert seit
    08.01.2001
    Beiträge
    242
    HI,

    danke für die schnelle antwort!

    grep -R ging bei mir nicht musste grep -r draus machen

    das script rennt im Prinzip, nur sobald der suchbegriff mehr als 1x pro datei
    vorkommt, versucht er die dann auch entsprechend oft zu moven - was ja auf einen fehler läuft.

    ja und dann hab ich noch das problem das in den Verzeichnissen dateien liegen welche im dateinamen ein "," und ein "=" enthalten (sind mails vom vpopmail),
    die kann ich ja nur moven, wenn ich die mit einem \ maskieren, muss ich
    dann vor dem moven das noch mit dem sed bearbeiten wenn ja wie?

    der tom

  4. #4
    Registrierter Benutzer
    Registriert seit
    25.12.1999
    Ort
    Stuttgart
    Beiträge
    259
    Hi,

    das mehrmalige Anzeigen derselben Datei kannst Du bei grep mit dem Parameter -c unterdrücken, bei den Dateinamen müsste es eigentlich reichen, wenn man die Variablen mit den Dateinamen quotiert (ein Testlauf mit cp anstatt mv laufen lassen

    Code:
    #!/bin/sh
    
    SEARCH_DB="/home/micha/development/scripts/samba/search_db"
    SEARCH_DIRS="/home/micha/development/scripts/samba/home/user1/
    /home/micha/development/scripts/samba/home/user2/"
    DEST_DIR="/home/micha/development/scripts/samba/tmp"
    
    for user in $SEARCH_DIRS
      do
      echo "Searching in $user..."
      while read regex
        do
        echo "Searching for $regex..."
        for file in `grep -rc "$regex" $user | cut -d ':' -f -1`
          do
          name=`basename "$file"`
          echo "Moving $file to $DEST_DIR/$name"
          mv "$file" "$DEST_DIR/$name"
        done
      done < $SEARCH_DB
    done
    
    exit 0
    Gruß micha
    IRC: irc.euirc.net #tux

  5. #5
    Registrierter Benutzer
    Registriert seit
    08.01.2001
    Beiträge
    242
    das mit dem quotieren des names haut prima hin, die c option beim grep allerdings
    tut die sache verschlimmbessern, hab das dann jetzt so geändert:

    Code:
        for file in `grep -r "$regex" $user | cut -d ':' -f -1`
          do
          name=`basename $file`
          if [ -f $file ]; then
           echo "Moving $file to $DEST_DIR/$name"
           mv "$file" "$DEST_DIR/$name"
          fi   
        done
    so tut das jetzt

    danke
    der tom

  6. #6
    AliBaba
    Gast
    Auch wenn die Sache schon funktioniert, wollte ich noch meinen Senf dazugeben.

    Dass grep -c nicht hilft, ist eigentlich kein Wunder, es löscht ja keine doppelten Zeilen, sondern *zählt*, wie oft eine Zeile mit dem Suchbegriff vorkommt.

    Ich fände es eigentlich ganz hübsch, am Anfang des Scripts mehrfache Zeilen aus der Datei mit den Suchbegriffen rauszuschmeißen, z. B. mit:
    sort $SEARCHDB | uniq >$SEARCHDB
    (oder als Ziel eine andere Datei, wenn Du die Originaldatei nicht verändern willst).

  7. #7
    Registrierter Benutzer
    Registriert seit
    21.06.1999
    Beiträge
    677
    Es gibt eine einfachere Möglichkeit als die Ausgabe von
    grep zu parsen:

    grep gibt unterschiedliche Returncodes zurück, je nachdem ob
    der Suchbegriff gefunden wird oder nicht.
    Ausserdem gibts eine Option, nach dem ersten Treffer abzubrechen.

    Für Details bittte die man page konsultieren.

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •