2016-06-08 7 views
0

Ich versuche, einige Dateien zu finden, und ich habe ein Bash-Skript dafür geschrieben und es auf diese Weise verwenden - ./findme.sh "before", aber es funktioniert nicht gut. Was ist das Problem? Wie kann ich es richtig umschreiben und verschönern?Finden Sie Dateien, die Zeichenfolge außer ein paar Ordner enthalten

#!/bin/bash 
string=$1 
clear 
find . -name "*.*" ! -path "./node_modules" \ 
     ! -path "./bower_components" \ 
     ! -path "./public_lib/bootstrap" \ 
     ! -path "./public_lib/jquery" \ 
     ! -path "./public_lib/lib/bootstrap" \ 
     ! -path "./public_lib/lib/jquery" \ 
-print | xargs grep -o -r -n -C 3 --color=auto "$string" ./ 

echo "Search end!" 
exit 0 
+1

Was wollen Sie tun? Suche alle Dateien in einem Verzeichnis nach einem Muster? – andlrc

+0

Ich versuche zu: 1. rekursiv nach Dateien nach Inhalt suchen 2. Ausschließen der angegebenen Ordner 3. Anzeige gefunden (nur übereinstimmende) im Format "Pfad/Dateiname: Zeilennummer" –

Antwort

1

Sie können richtig grep für diesen Einsatz:

#!/bin/bash 
grep -rnC 3 --color=auto \ 
    --exclude-dir={node_modules,bower_components} \ 
    --exclude-dir=public_lib/{,lib/}{bootstrap,jquery} -- "$1" . 

, die alle Dateien für $1 rekursive Suche wird und zeigen Zeilennummer und drei Linien über und unter dem Spiel.

Wenn Sie symbolischen Links folgen möchten, sollten Sie -R anstelle von -r verwenden.

--exclude-dir={node_modules,bower_components} Klammer Erweiterungen verwendet und erweitern:

--exclude-dir=node_modules --exclude-dir=bower_components 

und die fortgeschritteneren --exclude-dir=public_lib/{,lib/}{bootstrap,jquery}, wird erweitert zu:

--exclude-dir=public_lib/bootstrap --exclude-dir=public_lib/jquery \ 
--exclude-dir=public_lib/lib/bootstrap --exclude-dir=public_lib/lib/jquery 

Aufkantung und Newline zur Klarstellung hinzugefügt.

+0

Funktioniert nicht. Das habe ich mit meinem Skript http://imgur.com/Ga8qJuW (ignoriere ausgeschlossene Dirs) und dies - bei deins http://imgur.com/mxJangf –

+0

@ValSaven habe ich das '-o' weggelassen da es extrahiert wird die Übereinstimmungen und nicht die vollständige Zeile. – andlrc

0

Entsprechend der Such-Manpage müssen Sie entweder die vollständigen Dateinamen angeben, die nicht übereinstimmen sollen, z. ! -path "./node_modules/*" ! -path "./node_modules/*/*" (usw., wenn es tiefer geht) oder Pflaume verwenden, z.B. \(\(-path "./node_modules" -prune \) -o ..., in diesem Fall müssten Sie ein großes ODER erstellen, das mit -o für jeden auszuschließenden Pfad getrennt wird, z.

find . -name "*.*" \( -path "./node_modules" -prune \) -o \ 
     \( -path "./bower_components" -prune \) -o \ 
     \( -path "./public_lib/bootstrap" -prune \) -o \ 
     \( -path "./public_lib/jquery" -prune \) -o \ 
     \( -path "./public_lib/lib/bootstrap" -prune \) -o \ 
     \( -path "./public_lib/lib/jquery" -prune \) -o \ 
-print | xargs... 

bearbeiten leider die Bedingung vermasselt leicht, wie Sie sehen ...

+0

Wahrscheinlich vereinfachen als '\ (-path ... -o -path .... -o pfad ... \) -prune -o -name" *. * "-print | xargs ... ', da oben wirklich '-name' *. *" -a \ (-path "./node_modules" -prune \) 'ist, und' -a' ist eine höhere Präsesdenz als '-o'. – BroSlow

Verwandte Themen