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:

  1. c : Bytes
  2. w : 2 Bytes
  3. b : 512 Bytes (Standard)
  4. k : 1 KB
  5. M : 1 MB
  6. 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/*'


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow