Ich möchte nach Dateien suchen, die die Wörter enthalten Dansk
, Svenska
oder Norsk
in einer beliebigen Zeile mit einem verwendbaren Rückkehrcode (da ich wirklich nur die Information haben möchte, dass die Zeichenfolgen enthalten sind, geht mein Einzeiler etwas weiter als dies).
Ich habe viele Dateien mit Zeilen wie diesen:
Disc Title: unknown
Title: 01, Length: 01:33:37.000 Chapters: 33, Cells: 31, Audio streams: 04, Subpictures: 20
Subtitle: 01, Language: ar - Arabic, Content: Undefined, Stream id: 0x20,
Subtitle: 02, Language: bg - Bulgarian, Content: Undefined, Stream id: 0x21,
Subtitle: 03, Language: cs - Czech, Content: Undefined, Stream id: 0x22,
Subtitle: 04, Language: da - Dansk, Content: Undefined, Stream id: 0x23,
Subtitle: 05, Language: de - Deutsch, Content: Undefined, Stream id: 0x24,
(...)
Hier ist der Pseudocode von dem, was ich will:
for all files in directory;
if file contains "Dansk" AND "Norsk" AND "Svenska" then
then echo the filename
end
Was ist der beste Weg, dies zu tun? Kann es in einer Zeile gemacht werden?
PIPESTATUS
enthält das Array die Exit-Werte der Mitglieder einer Pipeline.pipefail
Shell-Option (vorübergehend)shopt -so pipefail
grep -Z
undxargs -0
ob Ihre Dateinamen Leerzeichen enthalten können.Noch eine andere Möglichkeit, nur Bash und Grep zu verwenden:
Für eine einzelne Datei 'test.txt':
Wird gedruckt,
test.txt
wenn die Datei alle drei enthält (in beliebiger Kombination). Die ersten beiden Greps drucken nichts (-q
) und die letzten drucken die Datei nur, wenn die anderen beiden bestanden haben.Wenn Sie dies für jede Datei im Verzeichnis tun möchten:
quelle
for f ...
: use"$f"
(doppelte Anführungszeichen) anstatt nur$f
sicherzustellen, dass Dateinamen mit eingebetteten Leerzeichen usw. korrekt behandelt werden.-i
macht die Groß- und Kleinschreibung unabhängig-r
macht die Dateisuche durch Ordner rekursiv-l
leitet die Liste der Dateien mit dem gefundenen Wort weitercat -
bewirkt, dass der nächste grep die an die Liste übergebenen Dateien durchsucht.quelle
So suchen Sie nach mehreren Zeichenfolgen in einer Datei in verschiedenen Zeilen (Verwenden Sie das Pipe-Symbol):
Anmerkungen:
Wenn Sie
""
mit Ihrem grep doppelte Anführungszeichen verwenden , müssen Sie der Pipe wie folgt entkommen:\|
um nach Dansk, Norsk und Svenska zu suchen.Angenommen, eine Zeile hat nur eine Sprache.
Exemplarische Vorgehensweise: http://www.cyberciti.biz/faq/howto-use-grep-command-in-linux-unix/
quelle
Norsk
, aber in drei verschiedenen Zeilen.Mit ack geht das ganz einfach :
-l
: Gibt eine Liste der Dateien zurück-x
: Nehmen Sie die Dateien von STDIN (der vorherigen Suche) und durchsuchen Sie nur diese DateienUnd Sie können einfach so lange weiterleiten, bis Sie genau die gewünschten Dateien erhalten.
quelle
Unknown option: x
. Gibt es eine bestimmte Version von ack, die dieses x-Flag unterstützt?Dadurch werden mehrere Wörter in mehreren Dateien gesucht:
quelle
Sie können dann den Rückgabewert mit der Shell abfangen
wenn Sie Ruby haben (1.9+)
quelle
if (a && b && c) {exit 0} else {exit 1}
oder knapperexit !(a && b && c)
Einfach:
Weitere Informationen finden Sie in diesem Beitrag
quelle
-l
Flagge hinzufügen , aber ansonsten scheint mir diese Antwort am einfachsten zu sein, es sei denn, ich vermisse etwas.Dies ist eine Mischung aus den Antworten von Glenn Jackman und Kurumi, die eine beliebige Anzahl von Regexen anstelle einer beliebigen Anzahl von festen Wörtern oder einer festen Menge von Regexen zulässt.
Führen Sie es so aus:
quelle
Folgendes hat bei mir gut funktioniert:
Wenn ich nur mit diesen drei .sh-Dateien finden wollte, hätte ich Folgendes verwenden können:
quelle
Hier ist eine Bash-Funktion, die die Antwort von @ kurumi erweitert.
Verwendung:
quelle
Ich habe das mit zwei Schritten gemacht. Erstellen Sie eine Liste von CSV-Dateien in einer Datei. Mithilfe dieser Seitenkommentare habe ich zwei skriptlose Schritte ausgeführt, um das zu erhalten, was ich brauchte. Geben Sie einfach in das Terminal ein:
Es hat genau das getan, was ich brauchte - Dateinamen drucken, die alle drei Wörter enthalten.
Beachten Sie auch die Symbole wie
`' "
quelle
Wenn Sie nur zwei Suchbegriffe benötigen, ist es wahrscheinlich am besten, jede Suche auszuführen und die Ergebnisse zu überschneiden:
quelle
Wenn Sie Git installiert haben
Der --no-Index durchsucht Dateien im aktuellen Verzeichnis, die nicht von Git verwaltet werden. Dieser Befehl funktioniert also in jedem Verzeichnis, unabhängig davon, ob es sich um ein Git-Repository handelt oder nicht.
quelle
Ich hatte dieses Problem heute und alle Einzeiler hier sind mir nicht gelungen, weil die Dateien Leerzeichen in den Namen enthielten.
Das habe ich mir ausgedacht:
quelle