So können Sie das angeben mit find
:
find . -type f -name "*_peaks.bed" ! -path "./tmp/*" ! -path "./scripts/*"
Erläuterung:
find .
- Starten Sie die Suche aus dem aktuellen Arbeitsverzeichnis (standardmäßig rekursiv).
-type f
- Geben Sie an, find
dass Sie nur Dateien in den Ergebnissen haben möchten
-name "*_peaks.bed"
- Suchen Sie nach Dateien, deren Name auf endet _peaks.bed
! -path "./tmp/*"
- Schließen Sie alle Ergebnisse aus, deren Pfad mit beginnt ./tmp/
! -path "./scripts/*"
- Schließen Sie auch alle Ergebnisse aus, deren Pfad mit beginnt ./scripts/
Testen der Lösung:
$ mkdir a b c d e
$ touch a/1 b/2 c/3 d/4 e/5 e/a e/b
$ find . -type f ! -path "./a/*" ! -path "./b/*"
./d/4
./c/3
./e/a
./e/b
./e/5
Sie waren ziemlich nah dran, die -name
Option berücksichtigt nur den Basisnamen, wobei -path
der gesamte Pfad berücksichtigt wird =)
_peaks.bed
.find
, aber da die Frage mit Linux gekennzeichnet ist, ist dies kein Problem. Gute Antwort..
bei Ihrer ersten Suchaufforderung verwenden, müssen Sie ihn in jedem Pfad verwenden, den Sie ausschließen. Die Pfadübereinstimmung ist ziemlich streng und führt keine Fuzzy-Suche durch. Also, wenn Sie es verwenden, wird esfind / -type f -name *.bed" ! -path "./tmp/"
nicht funktionieren. Sie müssen! -path "/tmp"
es glücklich machen müssen.$ ! -path "./directory/*"
-prune
nicht jede Datei im Baum, sondern überprüfen Sie sie." Wenn Ihre ausgeschlossenen Verzeichnisse sehr tief sind oder Unmengen von Dateien enthalten und Sie Wert auf Leistung-prune
legen, verwenden Sie stattdessen die Option.Hier ist eine Möglichkeit, wie Sie es tun können ...
quelle
find
und nicht nur mit GNU zu arbeitenfind
. Die Frage ist jedoch mit Linux gekennzeichnet, sodass dies nicht kritisch ist.Versuchen Sie etwas wie
und sei nicht zu überrascht, wenn ich es ein bisschen falsch verstanden habe. Wenn das Ziel ein Exec ist (anstelle von Print), ersetzen Sie es einfach.
quelle
Für mich hat diese Lösung bei einem Befehlsausführen mit Suchen nicht funktioniert. Ich weiß nicht wirklich warum, also ist meine Lösung
Erklärung: wie sampson-chen eins mit den Zusätzen von
-prune - ignoriere den Prozedurpfad von ...
-o - Wenn keine Übereinstimmung vorliegt, drucken Sie die Ergebnisse aus (beschneiden Sie die Verzeichnisse und drucken Sie die verbleibenden Ergebnisse).
quelle
find . -path ./scripts -prune -name '*_peaks.bed' -type f
. Nicht sicher, wie mehrere Verzeichnisse ausgeschlossen werden sollen. Dies listet auch das ausgeschlossene Verzeichnis der obersten Ebene auf, obwohltype
es angegeben ist. Das Ausschließen über Grep scheint einfacher zu sein, es sei denn, Sie möchten Prune verwenden, um den Suchvorgang zu beschleunigen.Sie können unten versuchen:
quelle
Verwenden
oder
oder
Die Reihenfolge ist wichtig. Es wird von links nach rechts ausgewertet. Beginnen Sie immer mit dem Pfadausschluss.
Erläuterung
Verwenden Sie
-not
(oder!
) nicht, um das gesamte Verzeichnis auszuschließen. Verwenden Sie-prune
. Wie im Handbuch erklärt:und im GNU Handbuch finden:
Wenn Sie verwenden
-not -path "./pathname"
, wertet find den Ausdruck für jeden Knoten unter aus"./pathname"
.Suchausdrücke sind nur eine Zustandsbewertung.
\( \)
- Gruppenoperation (Sie können verwenden-path "./tmp" -prune -o -path "./scripts" -prune -o
, aber es ist ausführlicher).-path "./script" -prune
- Wenn-path
true zurückgegeben wird und ein Verzeichnis ist, geben Sie true für dieses Verzeichnis zurück und steigen Sie nicht in dieses Verzeichnis ab.-path "./script" ! -prune
- es bewertet als(-path "./script") AND (! -prune)
. Es setzt das "immer wahr" der Pflaume auf immer falsch zurück. Das Drucken"./script"
als Match wird vermieden .-path "./script" -prune -false
- Da-prune
immer true zurückgegeben wird, können Sie dem folgen-false
, um dasselbe zu tun wie!
.-o
- ODER-Operator. Wenn zwischen zwei Ausdrücken kein Operator angegeben ist, wird standardmäßig der Operator AND verwendet.Daher
\( -path "./tmp" -o -path "./scripts" \) -prune -o -name "*_peaks.bed" -print
wird erweitert auf:Der Druck ist hier wichtig, weil er ohne erweitert wird auf:
-print
wird durch find hinzugefügt - deshalb müssen Sie es die meiste Zeit nicht in Ihren Ausdruck einfügen. Und da-prune
true zurückgegeben wird, werden "./script" und "./tmp" ausgegeben.Bei den anderen ist dies nicht erforderlich, da wir
-prune
auf immer false zurückgegeben haben.Hinweis: Sie können verwenden, um
find -D opt expr 2>&1 1>/dev/null
zu sehen, wie es optimiert und erweitert wird, umfind -D search expr 2>&1 1>/dev/null
zu sehen, welcher Pfad überprüft wird.quelle