Suche…
Einführung
find ist ein Befehl, um rekursiv ein Verzeichnis nach Dateien (oder Verzeichnissen) zu durchsuchen, die einem Kriterium entsprechen, und dann eine Aktion für die ausgewählten Dateien auszuführen.
find_path selection_criteria action suchen
Syntax
- find [-H] [-L] [-P] [-D debugopts] [-Olevel] [Pfad ...] [Ausdruck]
Suchen nach einer Datei nach Namen oder Erweiterung
So finden Sie Dateien / Verzeichnisse mit einem bestimmten Namen relativ zu pwd
:
$ find . -name "myFile.txt"
./myFile.txt
Verwenden Sie zum Suchen von Dateien / Verzeichnissen mit einer bestimmten Erweiterung einen Platzhalter:
$ find . -name "*.txt"
./myFile.txt
./myFile2.txt
Um Dateien / Verzeichnisse zu finden, die einer der vielen Erweiterungen entsprechen, verwenden Sie das Flag or
:
$ find . -name "*.txt" -o -name "*.sh"
So finden Sie Dateien / Verzeichnisse, deren Name mit abc beginnt und mit einem Buchstaben nach einer Ziffer endet:
$ find . -name "abc[a-z][0-9]"
Alle Dateien / Verzeichnisse in einem bestimmten Verzeichnis suchen
$ find /opt
Um nur nach Dateien (nicht nach Verzeichnissen) zu suchen, verwenden Sie -type f
:
find /opt -type f
Um nur nach Verzeichnissen (nicht nach regulären Dateien) zu suchen, verwenden Sie -type d
:
find /opt -type d
Dateien nach Typ suchen
Verwenden Sie zum Suchen von Dateien das Flag -type f
$ find . -type f
Verwenden Sie zum Suchen von Verzeichnissen das Flag -type d
$ find . -type d
Verwenden Sie zum Suchen von Blockgeräten das Flag -type b
$ find /dev -type b
Um Symlinks zu finden, verwenden Sie das Flag -type l
$ find . -type l
Befehle für eine gefundene Datei ausführen
Manchmal müssen wir Befehle für viele Dateien ausführen. Dies kann mit xargs
.
find . -type d -print | xargs -r chmod 770
Der obige Befehl sucht rekursiv alle Verzeichnisse ( -type d
) relativ zu .
(das ist Ihr aktuelles Arbeitsverzeichnis), und führen Sie chmod 770
auf ihnen aus. Die -r
Option gibt an xargs
nicht laufen chmod
wenn find
keine Dateien gefunden wurden.
Wenn Ihre Dateinamen oder Verzeichnisse ein Leerzeichen enthalten, kann dieser Befehl verschlucken. Eine Lösung ist die Verwendung der folgenden
find . -type d -print0 | xargs -r -0 chmod 770
Im obigen Beispiel geben die -print0
und -0
, dass die Dateinamen durch ein null
Byte getrennt werden, und ermöglichen die Verwendung von Sonderzeichen wie Leerzeichen in den Dateinamen. Dies ist eine GNU-Erweiterung, die in anderen Versionen von find
und xargs
möglicherweise nicht funktioniert.
Der bevorzugte Weg , dies zu tun ist , die überspringen xargs
Befehl und lassen Sie find
die subprocess nennen sich:
find . -type d -exec chmod 770 {} \;
Hier ist {}
ein Platzhalter, der angibt, dass Sie den Dateinamen an dieser Stelle verwenden möchten. find
führt chmod
für jede Datei einzeln aus.
Sie können alternativ alle Dateinamen an einen einzigen Aufruf von chmod
, indem Sie verwenden
find . -type d -exec chmod 770 {} +
Dies ist auch das Verhalten der obigen xargs
Snippets. (Um jede Datei einzeln aufzurufen, können Sie xargs -n1
)
Eine dritte Möglichkeit besteht darin, dass bash die Liste der Dateinamen durchläuft, find
Ausgaben zu find
:
find . -type d | while read -r d; do chmod 770 "$d"; done
Dies ist syntaktisch am schwierigsten, aber praktisch, wenn Sie für jede gefundene Datei mehrere Befehle ausführen möchten. Dies ist jedoch bei Dateinamen mit ungeraden Namen unsicher .
find . -type f | while read -r d; do mv "$d" "${d// /_}"; done
Dadurch werden alle Leerzeichen in Dateinamen durch Unterstriche ersetzt. (Dieses Beispiel funktioniert auch nicht, wenn führende Verzeichnisnamen Leerzeichen enthalten.)
Das Problem mit dem oben genannten ist, dass, while read -r
einen Eintrag pro Zeile erwartet, die Dateinamen jedoch Zeilenumbrüche enthalten können (und außerdem wird read -r
alle nachfolgenden Leerzeichen verlieren). Sie können dies beheben, indem Sie die Dinge umdrehen:
find . -type d -exec bash -c 'for f; do mv "$f" "${f// /_}"; done' _ {} +
Auf diese Weise erhält die -exec
die Dateinamen in einer vollständig korrekten und portablen Form. Die bash -c
erhält sie als eine Reihe von Argumenten, die in $@
, korrekt zitiert usw. (Das Skript muss diese Namen natürlich korrekt behandeln; jede Variable, die einen Dateinamen enthält, muss doppelt vorhanden sein) Zitate.)
Das geheimnisvolle _
ist notwendig, da das erste Argument für bash -c 'script'
zum Auffüllen von $0
.
Datei nach Zugriffs- / Änderungszeit suchen
In einem ext
Dateisystem verfügt jede Datei über eine gespeicherte Zeit für Zugriff, Änderung und (Status) Änderung. stat myFile.txt
diese Informationen stat myFile.txt
, können Sie stat myFile.txt
. Mit Hilfe von Flags innerhalb von find können wir nach Dateien suchen, die innerhalb eines bestimmten Zeitraums geändert wurden.
So finden Sie Dateien, die innerhalb der letzten 2 Stunden geändert wurden:
$ find . -mmin -120
So finden Sie Dateien, die in den letzten 2 Stunden nicht geändert wurden:
$ find . -mmin +120
Das obige Beispiel suchen nur auf der modifizierten Zeit - auf einem ccess mal, oder c gehängt Zeiten zu suchen, verwenden Sie a
, oder c
entsprechend.
$ find . -amin -120
$ find . -cmin +120
Allgemeines Format:
-mmin n
: Datei wurde vor n Minuten geändert
-mmin -n
: Datei wurde vor weniger als n Minuten geändert
-mmin +n
: Datei wurde vor mehr als n Minuten geändert
Suchen Sie nach Dateien, die in den letzten 2 Tagen geändert wurden:
find . -mtime -2
Suchen Sie nach Dateien, die in den letzten 2 Tagen nicht geändert wurden
find . -mtime +2
Verwenden Sie -atime
und -ctime
für die Zugriffszeit bzw. die Statusänderungszeit.
Allgemeines Format:
-mtime n
: Datei wurde vor 24 Stunden geändert
-mtime -n
: Datei wurde vor weniger als nx24 Stunden geändert
-mtime +n
: Datei wurde vor mehr als nx24 Stunden geändert
Suchen Sie nach Dateien, die in verschiedenen Datumsbereichen (2007-06-07 bis 2007-06-08) geändert wurden:
find . -type f -newermt 2007-06-07 ! -newermt 2007-06-08
Finden Sie Dateien, auf die in einer Reihe von Zeitstempeln zugegriffen wurde (unter Verwendung von Dateien als Zeitstempel), von vor 1 Stunde bis vor 10 Minuten:
touch -t $(date -d '1 HOUR AGO' +%Y%m%d%H%M.%S) start_date
touch -t $(date -d '10 MINUTE AGO' +%Y%m%d%H%M.%S) end_date
timeout 10 find "$LOCAL_FOLDER" -newerat "start_date" ! -newerat "end_date" -print
Allgemeines Format:
-newerXY reference
: Vergleicht den Zeitstempel der aktuellen Datei mit dem Verweis. XY
kann einen der folgenden Werte annehmen: at
(Zugriffszeit), mt
(Änderungszeit), ct
(Änderungszeit) und mehr. reference
ist der Name einer Datei , die den angegebenen Zeitstempel (Zugriff, Änderung, Änderung) oder eine Zeichenfolge , die eine absolute Zeit beschreibt, vergleichen soll.
Suchen von Dateien nach bestimmten Erweiterungen
Um alle Dateien eines bestimmten Erweiterung zu finden im Strompfad Sie folgende verwenden können , find
Syntax. Es funktioniert, indem bash's
eingebaute glob
Konstrukt von bash's
verwendet wird, um alle Namen mit der .extension
.
find /directory/to/search -maxdepth 1 -type f -name "*.extension"
Um alle Dateien des Typs .txt
allein aus dem aktuellen Verzeichnis zu suchen, tun Sie
find . -maxdepth 1 -type f -name "*.txt"
Dateien nach Größe suchen
Dateien suchen, die größer als 15 MB sind:
find -type f -size +15M
Finden Sie Dateien mit weniger als 12 KB:
find -type f -size -12k
Finden Sie Dateien genau mit einer Größe von 12 KB:
find -type f -size 12k
Oder
find -type f -size 12288c
Oder
find -type f -size 24b
Oder
find -type f -size 24
Allgemeines Format:
find [options] -size n[cwbkMG]
Suchen Sie Dateien mit n-Blockgröße, wobei + n mehr als n-Block bedeutet, -n weniger als n-Block und n (ohne Vorzeichen) genau n-Block
Block Größe:
-
c
: Bytes -
w
: 2 Bytes -
b
: 512 Bytes (Standard) -
k
: 1 KB -
M
: 1 MB -
G
: 1 GB
Den Pfad filtern
Mit -path
Parameter -path
kann ein Muster angegeben werden, das dem Pfad des Ergebnisses entspricht. Das Muster kann auch mit dem Namen selbst übereinstimmen.
So suchen Sie nur Dateien, die an einem beliebigen Ort im log
(Ordner oder Name) ein log
enthalten:
find . -type f -path '*log*'
So suchen Sie nur Dateien in einem Ordner namens log
(auf einer beliebigen Ebene):
find . -type f -path '*/log/*'
So suchen Sie nur Dateien in einem Ordner namens log
oder data
:
find . -type f -path '*/log/*' -o -path '*/data/*'
So suchen Sie alle Dateien mit Ausnahme der Dateien, die in einem Ordner namens bin
:
find . -type f -not -path '*/bin/*'
So finden Sie alle Dateien mit Ausnahme der Dateien, die in einem Ordner namens bin
oder Protokolldateien enthalten sind:
find . -type f -not -path '*log' -not -path '*/bin/*'