Ab ( Platzhalter vor und nach "etwas Text" beachten )
find . -type f -name '*some text*'
Wie kann man alle versteckten Dateien und Verzeichnisse ausschließen / ignorieren?
Ich habe schon viel zu lange gegoogelt, bin auf einiges gestoßen und! (Ausrufezeichen) Parameter, aber kein passendes (und sparsames) Beispiel, das gerade funktioniert hat .
Piping |
zu grep
wäre eine Option und ich würde auch Beispiele dafür begrüßen; aber in erster Linie interessiert mich einen kurzen Einzeiler (oder ein paar Stand-alone - Einzeiler, veranschaulicht verschiedene Möglichkeiten, den gleichen Befehlszeilen Ziel zu erreichen) nur mit find
.
ps: Dateien in Linux suchen und bestimmte Verzeichnisse ausschließen scheint eng miteinander verbunden zu sein, aber a) wird noch nicht akzeptiert und b) ist verwandt, aber anders und verschieden, aber c) kann Inspiration liefern und helfen, die Verwirrung zu lokalisieren!
Bearbeiten
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
funktioniert. Der reguläre Ausdruck sucht nach "irgendetwas, dann nach einem Schrägstrich, dann nach einem Punkt und dann nach irgendetwas" (dh nach allen versteckten Dateien und Ordnern einschließlich ihrer Unterordner) und dem "!" negiert den regulären Ausdruck.
quelle
Antworten:
Dies druckt alle Dateien, die Nachkommen Ihres Verzeichnisses sind, und überspringt versteckte Dateien und Verzeichnisse:
Wenn Sie also nach einer Datei mit
some text
dem Namen suchen und versteckte Dateien und Verzeichnisse überspringen möchten, führen Sie Folgendes aus:Erläuterung:
Mit dieser
-path
Option wird ein Muster anhand der gesamten Pfadzeichenfolge überprüft.*
ist ein Platzhalter,/
ist ein Verzeichnis-Trennzeichen,\.
ist ein Punkt (es muss maskiert werden, um eine besondere Bedeutung zu vermeiden) und*
ist ein weiterer Platzhalter.-not
bedeutet, dass Sie keine Dateien auswählen, die diesem Test entsprechen.Ich denke nicht, dass
find
das klug genug ist, um zu vermeiden, dass versteckte Verzeichnisse im vorherigen Befehl rekursiv durchsucht werden. Wenn Sie also Geschwindigkeit benötigen, verwenden Sie-prune
stattdessen Folgendes:quelle
-print
am Ende brauchst !-name '\.*' would be more efficient instead of
Ich bin mir auch nicht sicher, ob -path` (da der Pfad nach Unterpfaden sucht, diese jedoch entfernt werden).
in diesem Zusammenhang?find
bedeutet das aktuelle Verzeichnis: Esfind
werden alle Dateien und Verzeichnisse unter dem aktuellen Verzeichnis angezeigt . Das nachfolgende Argumentpath
ist ein regulärer Ausdruck, bei dem ein Punkt normalerweise "ein beliebiges Zeichen" bedeutet. Damit es sich um einen wörtlichen Punkt handelt, müssen wir ihn mit einem Backslash maskieren. Das Argument nach-name
ist kein regulärer Ausdruck, aber es erweitert Platzhalter wie?
und*
wie eine Shell..
eine besondere Bedeutung geht..
. Soweit mir bekannt ist , nur müssen diese maskiert werden:*
,?
, und[]
.Dies ist eine der wenigen Möglichkeiten, um Punktdateien auszuschließen, die auch unter BSD, Mac und Linux korrekt funktionieren:
$PWD
Den vollständigen Pfad zum aktuellen Verzeichnis ausgeben, damit der Pfad nicht mit beginnt./
-name ".*" -prune
Stimmt mit allen Dateien oder Verzeichnissen überein, die mit einem Punkt beginnen und dann nicht absteigen-o -print
bedeutet, den Dateinamen zu drucken, wenn der vorherige Ausdruck nicht mit irgendetwas übereinstimmt. Wenn Sie-print
oder verwenden, werden-print0
alle anderen Ausdrücke standardmäßig nicht gedruckt.quelle
-o ... -print
ist hilfreich. Für meine Verwendung habe ich jetztfind ... '!' -name . -name '.*' -prune -o ... -print
, was bequemer war als mit $ PWD.Schließt alle versteckten Verzeichnisse und versteckten Dateien unter $ DIR aus
quelle
Die Antwort, die ich ursprünglich als "Bearbeitung" meiner ursprünglichen Frage oben gepostet habe:
find . \( ! -regex '.*/\..*' \) -type f -name "whatever"
funktioniert. Der reguläre Ausdruck sucht nach "irgendetwas, dann nach einem Schrägstrich, dann nach einem Punkt und dann nach irgendetwas" (dh nach allen versteckten Dateien und Ordnern einschließlich ihrer Unterordner) und dem "!" negiert den regulären Ausdruck.quelle
find . \( ! -regex './\..*' \) -type f -maxdepth 1 -print
Sie müssen dafür nicht verwenden
find
. Verwenden Sie einfach globstar in der Shell selbst, wie:oder:
wo
**/
für einen beliebigen Ordner rekursiv und*foo*
jede Datei , die hatfoo
in seinem Namen.Standardmäßig werden mit
ls
Dateinamen ohne versteckte Dateien und Verzeichnisse gedruckt.Wenn Sie das Globbing nicht aktiviert haben, tun Sie dies mit
shopt -s globstar
.Hinweis: Eine neue Globbing-Option funktioniert in Bash 4, zsh und ähnlichen Shells.
Beispiel:
quelle
ls
!echo **/*foo*
/
bedeutet Ordner, es trennt Verzeichnisse vom Dateinamen.*
im Grunde alles darstellt.@ Flimms Antwort ist gut, vor allem, weil es verhindert, dass Fundstücke in versteckte Verzeichnisse gelangen . Ich bevorzuge diese Vereinfachung:
Im Allgemeinen, um alle versteckten Pfade (normale Dateien, Verzeichnisse usw.) auszuschließen:
Verwenden Sie beispielsweise Ihr Arbeitsverzeichnis als Startpunkt und
-name '*some text*'
als Ausdruck:Im Gegensatz zu der Antwort von @ Flimm sind keine versteckten Dateien oder Verzeichnisse der einfache Fall. Der
-path '*/.*'
Ausdruck gilt für alle Pfade (reguläre Dateien, Verzeichnisse usw.), die.
unmittelbar nach dem Dateitrennzeichen stehen/
. Diese Zeile schneidet also sowohl versteckte Dateien als auch Verzeichnisse.Das Zulassen ausgeblendeter Dateien beim Ausschließen ausgeblendeter Verzeichnisse erfordert einen weiteren Filter. Hier würden Sie
-type d
den zu beschneidenden Ausdruck einfügen.Zum Beispiel:
In diesem Fall
-type d -path '*/.*'
gilt diestrue
nur für Verzeichnisse. Daher werden nur Verzeichnisse beschnitten.quelle
find
hat nette logische Schalter wie-and
und-not
Sie können sie zu Ihrem Vorteil nutzen, um eine passende Datei mit zwei Regeln zu finden:Wie Sie sehen können,
find
verwendet zwei Regeln-name '*hidden_file*'
und-and \( -not -name ".*" \)
diese Dateinamen zu finden , die beiden Bedingungen entsprechen - Dateinamen mithidden_file
drin , aber ohne Punkt führt. Beachten Sie die Schrägstriche vor Klammern - sie werden verwendet, um Klammern alsfind
Argumente zu definieren, anstatt eine Unterschale zu definieren (was Klammern sonst ohne Schrägstriche bedeuten).quelle
Anmerkungen:
.
: aktueller Ordner-maxdepth 1
, um rekursiv zu suchen-type f
: finde Dateien, nicht Verzeichnisse (d
)-not -path '*/\.*'
: nicht zurückkehren.hidden_files
sed 's/^\.\///g'
: entferne das vorangestellte./
aus der Ergebnislistequelle