Kleines Suchscript

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

Status
Für weitere Antworten geschlossen.

jahlives

Benutzer
Registriert
19. Aug. 2008
Beiträge
18.275
Reaktionspunkte
4
Punkte
0
Ich musste heute in einem Verzeichnis voller PHP Dateien nach denjenigen suchen, die einen bestimmten String enthalten. Direkt auf der Kommandokonsole hatte ich es nur hingekriegt, dass ich die Zeilen ausgegeben bekommen habe. Das war jedoch ohne Angabe über das File nicht wirklich zu gebrauchen.
Also habe ich mir folgendes Helferlein geschrieben, welches die Suche übernimmt. Vielleicht kanns jemand brauchen
Code:
#!/bin/sh
if [ "$1" = '-h' ] || [ "$1" = '--help' ] || [ $# -eq 0 ] ; then
 echo ""
 echo "Sucht rekursiv nach dem Vorkommen eines Strings in einer Datei"
 echo ""
 echo "Usage     : search nadel [heuhaufen]"
 echo "nadel     : String nach dem gesucht werden soll"
 echo "heuhaufen : fakultative Angabe des Suchpfades."
 echo "            Ohne heuhaufen wird im aktuellen Verzeichnis gesucht"
 exit
fi
if [ -z $1 ] ; then
 echo "Kein Suchstring angegeben"
 exit
fi

if [ -z $2 ] ; then
 pfad=$(pwd)
 echo "Starte Suche im aktuellen Verzeichnis ($pfad)"
else
 if [ -e $2 ] ; then
  pfad=$2
  echo "Starte Suche in $pfad"
 else
  echo "Pfad nicht gefunden ($2)"
  exit
 fi
fi
for i in $(find $pfad  -type f) ; do
 t=$(cat "$i" | grep "$1")
 if [ "$?" = 0 ] ; then
  echo "$i"
 fi
done
 
Boa, wie oft ich sowas schon gesucht habe, danke dir. Werd es bestimmt wieder einmal benötigen.

lg Alex
 
Ich stehe ja voll auf den KISS (Keep It Simple Stupid) approach. :) Sollte zudem auch schneller laufen, weil nicht zichmal grep und cat gespawned werden.

Rich (BBCode):
grep -l suchwort *

Ggf. noch interessant: -L statt -l invertiert die Ausgabe, listet also alles Files die suchwort nicht enthalten. -i macht die Suche unabänging von gross/kleinschreibung.

gruss
dude
 
Zuletzt bearbeitet:
Ich hatte mal vor langer Zeit ein Projekt dazu angefangen. http://www.synology-forum.de/showthread.html?t=2079. Aber so richtige Begeisterung wollte nicht aufkommen. Vermutlich hat es keinen interessiert. Jetzt ist diese Suche im AdminTool-Explorer drinne ...

Itari
 
@thedude
Ganz schön kurz :D
Habe es mal in den Suchcode eingebaut und mit time gemessen. Dein Vorschlag hat nur ein Drittel der Laufzeit, verglichen mit meinem Highperformance Code ;)
Dein Code
Code:
time search listFileContents
Starte Suche nach "listFileContents" im aktuellen Verzeichnis (/volume1/web)
/volume1/web/include
svnlook.php template.php

real    0m 3.89s
user    0m 3.57s
sys     0m 0.32s
und mein "Renner"
Code:
time search listFileContents
Starte Suche nach "listFileContents" im aktuellen Verzeichnis (/volume1/web)
/volume1/web/include/template.php
/volume1/web/include/svnlook.php
real    0m 11.46s
user    0m 4.81s
sys     0m 6.63s
Also hoffe ich dass du nix dagegen hast wenn ich deinen Code ratze und selber verwende :)
Code:
#!/bin/sh
if [ "$1" = '-h' ] || [ "$1" = '--help' ] || [ $# -eq 0 ] ; then
 echo ""
 echo "Sucht rekursiv nach dem Vorkommen eines Strings in einer Datei"
 echo ""
 echo "Usage     : search nadel [heuhaufen]"
 echo "nadel     : String nach dem gesucht werden soll"
 echo "heuhaufen : fakultative Angabe des Suchpfades."
 echo "            Ohne heuhaufen wird im aktuellen Verzeichnis gesucht"
 exit
fi
if [ -z $1 ] ; then
 echo "Kein Suchstring angegeben"
 exit
fi

if [ -z $2 ] ; then
 pfad=$(pwd)
 echo "Starte Suche nach \"$1\" im aktuellen Verzeichnis ($pfad)"
else
 if [ -e $2 ] ; then
  pfad=$2
  echo "Starte Suche nach \"$1\" in $pfad"
 else
  echo "Pfad nicht gefunden ($2)"
  exit
 fi
fi
for i in $(find $pfad  -type d) ; do
 cd $i
 t=$(grep -l "$1" *)
 if [ $? -eq 0 ] ; then
  echo $i
  echo $t
  echo ""
 fi
done
Gruss

tobi
 
Hmm, ganz schön viel Stoff da ... wenn du den IPKG grep nehmen könntest, wäre das schlichter:

Rich (BBCode):
/opt/bin/grep -Rn "listFileContents" /volume1/web

Rennt durch die Verzeichnisse (rekursiv) und ist mit Dateinamen und Zeilennummern, erschrick nicht ;)

Itari
 
Hmm, ganz schön viel Stoff da ... wenn du den IPKG grep nehmen könntest, wäre das schlichter:
And the winner is itari
Code:
time /opt/bin/grep -Rl "listFileContents" /volume1/web
/volume1/web/include/template.php
/volume1/web/include/svnlook.php
real    0m 0.19s
user    0m 0.06s
sys     0m 0.14s
schneller gehts nimmer :D

Und noch der Code
Code:
#!/bin/sh
if [ "$1" = '-h' ] || [ "$1" = '--help' ] || [ $# -eq 0 ] ; then
 echo ""
 echo "Sucht rekursiv nach dem Vorkommen eines Strings in einer Datei"
 echo ""
 echo "Usage     : search nadel [heuhaufen]"
 echo "nadel     : String nach dem gesucht werden soll"
 echo "heuhaufen : fakultative Angabe des Suchpfades."
 echo "            Ohne heuhaufen wird im aktuellen Verzeichnis gesucht"
 exit
fi
if [ -z $1 ] ; then
 echo "Kein Suchstring angegeben"
 exit
fi

if [ -z $2 ] ; then
 pfad=$(pwd)
 echo "Starte Suche nach \"$1\" im aktuellen Verzeichnis ($pfad)"
else
 if [ -e $2 ] ; then
  pfad=$2
  echo "Starte Suche nach \"$1\" in $pfad"
 else
  echo "Pfad nicht gefunden ($2)"
  exit
 fi
fi
/opt/bin/grep -Rl "$1" $pfad
 
Im Grunde könntest jetzt ne Art Datei Google draus machen.

Itari
 
Hi,
Rich (BBCode):
DS-106>search Goetz Wohnung
found 'Goetz' in 'Arbeitszimmer'
DS-106>search Nadel Bett
there is no 'Nadel' in 'Bett', good night!
Na dann kann ich ja getrost schlafen gehen:D.

Gruß Götz
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat