Wie kann ich rekursiv alle Dateien in aktuellen und Unterordnern finden, basierend auf dem Platzhalterabgleich?

1888

Wie kann ich rekursiv alle Dateien in aktuellen und Unterordnern finden, basierend auf dem Platzhalterabgleich?

John
quelle

Antworten:

2742

Verwenden Sie dafür find :

find . -name "foo*"

findbenötigt einen Startpunkt und der .(Punkt) zeigt auf das aktuelle Verzeichnis.

tux21b
quelle
21
Ich weiß, dass dies als Linux markiert ist, aber dies ist erwähnenswert: Der Pfad ist für andere * nix-Varianten erforderlich, die nicht Linux sind. Unter Linux ist der Pfad optional, wenn Sie dot verwenden möchten.
IslandCow
4
@Seatter "foo *" weist find an, nach allen Dateien zu suchen, die mit "foo" beginnen. Es ist nur sein Beispiel. Sie können "gpio *" verwenden, um alle Dateien zu finden, deren Namen mit gpio beginnen, oder einfach "gpio1", um alle Dateien mit dem Namen gpio1 zu finden.
schumacher574
29
Beachten Sie, dass das "foo *" in Anführungszeichen steht, damit die Shell es nicht erweitert, bevor Sie es übergeben, um es zu finden. Wenn Sie nur getan haben find . foo*, foo*würde das erweitert und dann übergeben, um zu finden.
grinch
33
Hervorzuheben ist, dass " "dies für die rekursive Suche sehr wichtig ist.
WesternGun
3
Ebenfalls nützlich: Wenn Sie nicht über Verzeichnisse benachrichtigt werden möchten, für die Sie keine Berechtigung haben (oder andere Fehler), können Sie dies tunfind . -name "foo*" 2>/dev/null
Jobbo
221

Piping Find in Grep ist oft bequemer; Sie erhalten die volle Leistung regulärer Ausdrücke für den beliebigen Platzhalterabgleich.

So finden Sie beispielsweise alle Dateien mit der Zeichenfolge "foo" ohne Berücksichtigung der Groß- und Kleinschreibung im Dateinamen:

~$ find . -print | grep -i foo
Paul Whipp
quelle
57
findhat auch die -iname, -regexund -iregexFlaggen für Groß- und Kleinschreibung Wildcard, regex und Groß- und Kleinschreibung Regex Matching, um so kochend grepist nicht erforderlich.
Iobender
7
Ich denke nicht, dass es darum geht, unnötig zu sein, sondern bequemer zu sein.
Elijah Lynn
1
Wenn Sie jedoch an grep -v weiterleiten, können Sie einfache Zeichenfolgen oder reguläre Ausdrücke verwenden, um nicht gewünschte Einträge zu entfernen.
door_number_three
3
@iobender - Leider kann ich Ihnen aus Erfahrung sagen, dass nicht alle Systeme mit einem findBefehl ausgestattet sind, der diese Optionen unterstützt. Manchmal grepwird die einzige Option.
Herr Llama
150

find findet alle Dateien, die einem Muster entsprechen:

find . -name "*foo"

Wenn Sie jedoch ein Bild möchten:

tree -P "*foo"

Hoffe das hilft!

IslandCow
quelle
18
brew install treefür Mac OSX-Benutzer ohne apt-getInstallation
DeBraid
1
Unter macOS Sierra getestet, fügen Sie einfach '--print' -> 'find hinzu. Name "* foo" --print '. superuser.com/questions/177289/searching-mac-through-terminal
John-Salib
2
sudo yum install tree -y für CentOS
Santosh Kumar Arjunan
39
find -L . -name "foo*"

In einigen Fällen habe ich den Parameter -L benötigt, um symbolische Verzeichnisverknüpfungen zu verarbeiten. Standardmäßig werden symbolische Links ignoriert. In diesen Fällen war es ziemlich verwirrend, da ich das Verzeichnis in ein Unterverzeichnis ändern und sehen würde, dass die Datei mit dem Muster übereinstimmt, aber find den Dateinamen nicht zurückgeben würde. Die Verwendung von -L löst dieses Problem. Die symbolischen Verknüpfungsoptionen für find sind -P -L -H

toddcscar
quelle
1
L-Schalter ist sehr hilfreich. Oft hat der Benutzer keine Ahnung von zugrunde liegenden Verzeichnissen, unabhängig davon, ob es sich um Softlinks oder normale Verzeichnisse handelt. Im Zweifelsfall ist es also immer gut, die Option L zu verwenden. Zumindest hat es mir immer geholfen.
Ritesh
2
Das war die Antwort für mich. Vielen Dank!
iedmrc
33

Wenn Ihre Shell eine neue Globbing-Option unterstützt (kann durch :) aktiviert werden shopt -s globstar, können Sie Folgendes verwenden:

echo **/*foo*

um Dateien oder Ordner rekursiv zu finden. Dies wird von Bash 4, zsh und ähnlichen Shells unterstützt.


Persönlich habe ich diese Shell-Funktion definiert:

f() { find . -name "*$1*"; }

Hinweis: Die obige Zeile kann direkt in die Shell eingefügt oder der ~/.bashrcDatei Ihres Benutzers hinzugefügt werden.

Dann kann ich nach Dateien suchen, indem ich Folgendes eingebe:

f some_name

Alternativ können Sie ein fdDienstprogramm mit einer einfachen Syntax verwenden, z fd pattern.

Kenorb
quelle
1
Dies geht nur in eine Ebene. Nicht wieder in die Unterverzeichnisse für mich
Broncha
3
@Broncha Weil Sie das erweiterte Globbing per shopt -s globstarBefehl aktivieren müssen . Dies wird in Bash-, zsh- und ähnlichen Shells unterstützt.
Kenorb
bash-3.2$ shopt -s globstargibtbash: shopt: globstar: invalid shell option name
zeichnete
@rewish Sie müssen Ihre Bash auf 4.x
aktualisieren
echo * / * foo ist weniger schnell als find
Josef Klimuk
32

fd

Wenn findes zu langsam ist, versuchen Sie es mit dem fdDienstprogramm - eine einfache und schnelle Alternative zufind Rust.

Syntax:

fd PATTERN

Demo:

Homepage: https://github.com/sharkdp/fd

Kenorb
quelle
17
Zum ersten Mal seit fast 9 Jahren habe ich ein GIF auf SO gesehen. Gut gemacht!
Joshua Pinter
1
Diese Leistungsergebnisse sehen sehr vielversprechend aus. Sie könnten erwägen, fd zum
Selbstbrauen
off topic: Mit welchem ​​Tool haben Sie eine SVG-Datei für die Demo erstellt?
Aprodan
2
@aprodan Das Demo-Image wurde von GitHub kopiert, aber ich glaube, sie verwenden es asciinemaund dann in das GIF-Format konvertiert, aber ich bin mir nicht sicher.
Kenorb
1
Eigentlich ist es das SVG-Format, kann also wahrscheinlich asciicast2vectorverwendet werden.
Kenorb
27
find <directory_path>  -type f -name "<wildcard-match>"

In der Platzhalterübereinstimmung können Sie die Zeichenfolge angeben, mit der Sie übereinstimmen möchten, z. B. * .c (für alle c-Dateien).

XYZ_Linux
quelle
1
Ihre Antwort ist hier die erste, die richtig ist, da nur Dateien wie angegeben durchsucht werden. Die anderen, die keinen Typ angeben, geben Verzeichnisse zurück.
Wilsotc
Wenn Sie nach einem Verzeichnis suchen möchten, könnte "-type f" in "-type d" geändert werden
XYZ_Linux
11

Sie können verwenden:

# find . -type f  -name 'text_for_search'

Wenn Sie REGX verwenden möchten, verwenden Sie -iname

# find . -type f  -iname 'text_for_search'
user8848899
quelle
9

Der folgende Befehl listet alle Dateien mit dem genauen Namen "Muster" (zum Beispiel) in den aktuellen und seinen Unterordnern auf.

find ./ -name "pattern"

anshul
quelle
8

Die Standardmethode für die Suche nach rekursiven Dateien ist in den meisten Fällen verfügbar

find . -name "filepattern"

Es beginnt mit dem rekursiven Durchlaufen von Dateinamen oder Mustern in dem aktuellen Verzeichnis, in dem Sie sich befinden. Mit dem Befehl find können Sie Platzhalter und verschiedene Schalter verwenden, um die vollständige Liste der Optionen anzuzeigen

man find

oder wenn auf Ihrem System keine Manpages verfügbar sind

find --help

Es gibt jedoch modernere und schnellere Tools als die, die Ihr gesamtes Dateisystem durchlaufen und Ihre Dateien indizieren. Ein solches häufiges Tool ist das Suchen oder Verschieben / mlocate. Sie sollten das Handbuch Ihres Betriebssystems überprüfen, wie es installiert wird, und sobald es installiert ist installiert muss es die Datenbank initiieren, wenn das Installationsskript es nicht für Sie erledigt, kann es manuell durch Eingabe erfolgen

sudo updatedb

Und um damit nach einem bestimmten Dateityp zu suchen

locate filename

Um im aktuellen Verzeichnis nach Dateinamen oder Mustern zu suchen, können Sie Folgendes eingeben:

 pwd | xargs -n 1 -I {} locate "filepattern"

Es durchsucht die Dateidatenbank und druckt schnell Pfadnamen aus, die dem von Ihnen eingegebenen Muster entsprechen. Geben Sie Folgendes ein, um die vollständige Liste der Suchoptionen anzuzeigen: locate --help oderman locate

Darüber hinaus können Sie locate so konfigurieren, dass die Datenbank zu geplanten Zeiten über einen Cron-Job aktualisiert wird. So sieht ein Beispiel für Cron aus, das die Datenbank um 1 Uhr morgens aktualisiert:

0 1 * * * updatedb

Diese Cron-Jobs müssen von root konfiguriert werden, da updateb Root-Berechtigungen benötigt, um das gesamte Dateisystem zu durchlaufen.

Aleksandar Pavić
quelle
7

für die Dateisuche
find / -xdev -name settings.xml -> ganzer Computer
find ./ -xdev -name settings.xml -> aktuelles Verzeichnis & sein Unterverzeichnis

für Dateien mit Erweiterungstyp

find . -type f -name "*.iso"
Alberto
quelle
6

Ich bin überrascht zu sehen, dass die Lokalisierung nicht stark genutzt wird, wenn wir rekursiv vorgehen sollen.

Ich würde zuerst "$ PWD" suchen, um die Liste der Dateien im aktuellen Ordner von Interesse abzurufen, und dann nach Belieben Greps auf ihnen ausführen.

locate "$PWD" | grep -P <pattern>

Dies setzt natürlich voraus, dass die Aktualisierung abgeschlossen ist und der Index regelmäßig aktualisiert wird. Dies ist eine viel schnellere Methode, um Dateien zu finden, als eine Suche auszuführen und sie zu bitten, den Baum hinunterzugehen. Der Vollständigkeit halber erwähnen. Nichts gegen die Verwendung von find, wenn der Baum nicht sehr schwer ist.

Melchi
quelle
locate "$PWD*.mp4" Nur daran zu erinnern , dass Sie in der Lage sein kann , die überspringengrep
Jefferey Cave
5

Der folgende Befehl hilft bei der Suche nach Dateien

1) Unabhängig vom Fall
2) Ergebnis Ausschließen von Ordnern ohne Berechtigung
3) Suchen vom Stammverzeichnis oder vom gewünschten Pfad. Ändern Sie / mit dem Pfad, den Sie bevorzugen.

Syntax:
find -iname '' 2> & 1 | grep -v Beispiel "Berechtigung verweigert"


find / -iname 'C * .xml' 2> & 1 | grep -v "Berechtigung verweigert"

find / -iname '*C*.xml'   2>&1 | grep -v "Permission denied"
MukeshKoshyM
quelle
1
Warum um alles in der Welt benutzt du dafür grep? find / -iname '*C*.xml' 2>/dev/null
Leiten Sie
3

Wenn Sie eine spezielle Datei mit Platzhalter durchsuchen möchten, können Sie folgenden Code verwenden:

find . -type f -name "*.conf"

Angenommen, Sie möchten alle .conf-Dateien von hier aus durchsuchen:

.bedeutet, dass die Suche von hier aus gestartet wurde (aktueller Ort)
-typebedeutet die Art des Suchelements, bei dem es sich um die Datei (f) handelt.
-namebedeutet, dass Sie Dateien mit * .conf- Namen suchen möchten .

Reza Harasani
quelle
3

Dadurch werden alle zugehörigen Dateien in aktuellen und Unterverzeichnissen durchsucht und ihre Zeilenanzahl separat sowie vollständig berechnet:

find . -name "*.wanted" | xargs wc -l
Jay Yang
quelle
2

Verwenden

find path/to/dir -name "*.ext1" -o -name "*.ext2"

Erläuterung

  1. Der erste Parameter ist das Verzeichnis, das Sie durchsuchen möchten.
  2. Standardmäßig finderfolgt die Rekursion.
  3. Das -osteht für -or. Oben bedeutet also, nach diesem oder diesem Platzhalter zu suchen. Wenn Sie nur ein Muster haben, brauchen Sie es nicht -o.
  4. Die Anführungszeichen um das Platzhaltermuster sind erforderlich.
Shital Shah
quelle