TLDR: Verstehen Sie Ihre Stammverzeichnisse und passen Sie Ihre Suche von dort aus mithilfe der -path <excluded_path> -prune -o
Option an. Fügen Sie /
am Ende des ausgeschlossenen Pfads kein nachfolgendes Zeichen ein.
Beispiel:
find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
Um das effektiv zu nutzen find
, ist es meines Erachtens unerlässlich, ein gutes Verständnis Ihrer Dateisystem-Verzeichnisstruktur zu haben. Auf meinem Heimcomputer habe ich Festplatten mit mehreren TB, wobei etwa die Hälfte dieses Inhalts mit rsnapshot
(dh rsync
) gesichert wurde . Obwohl auf einem physisch unabhängigen (doppelten) Laufwerk gesichert, wird es unter meinem Systemverzeichnis root ( /
) bereitgestellt /mnt/Backups/rsnapshot_backups/
::
/mnt/Backups/
└── rsnapshot_backups/
├── hourly.0/
├── hourly.1/
├── ...
├── daily.0/
├── daily.1/
├── ...
├── weekly.0/
├── weekly.1/
├── ...
├── monthly.0/
├── monthly.1/
└── ...
Das /mnt/Backups/rsnapshot_backups/
Verzeichnis belegt derzeit ~ 2,9 TB mit ~ 60 Millionen Dateien und Ordnern. Das einfache Durchlaufen dieser Inhalte braucht Zeit:
## As sudo (#), to avoid numerous "Permission denied" warnings:
time find /mnt/Backups/rsnapshot_backups | wc -l
60314138 ## 60.3M files, folders
34:07.30 ## 34 min
time du /mnt/Backups/rsnapshot_backups -d 0
3112240160 /mnt/Backups/rsnapshot_backups ## 3.1 TB
33:51.88 ## 34 min
time rsnapshot du ## << more accurate re: rsnapshot footprint
2.9T /mnt/Backups/rsnapshot_backups/hourly.0/
4.1G /mnt/Backups/rsnapshot_backups/hourly.1/
...
4.7G /mnt/Backups/rsnapshot_backups/weekly.3/
2.9T total ## 2.9 TB, per sudo rsnapshot du (more accurate)
2:34:54 ## 2 hr 35 min
Jedes Mal, wenn ich auf meiner /
(Root-) Partition nach einer Datei suchen muss , muss ich mich mit dem Durchlaufen meiner Sicherungspartition befassen (wenn möglich vermeiden).
BEISPIELE
Unter den in diesem Thread unterschiedlich vorgeschlagenen Ansätzen ( So schließen Sie ein Verzeichnis im Befehl find. Aus ) finde ich, dass die Suche mit der akzeptierten Antwort viel schneller ist - mit Einschränkungen.
Lösung 1
Angenommen, ich möchte die Systemdatei finden libname-server-2.a
, aber meine rsnapshot
Sicherungen nicht durchsuchen . Verwenden Sie den Ausschlusspfad /mnt
(dh verwenden /mnt
, nicht /mnt/
oder /mnt/Backups
oder oder ...) , um schnell eine Systemdatei zu finden :
## As sudo (#), to avoid numerous "Permission denied" warnings:
time find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
/usr/lib/libname-server-2.a
real 0m8.644s ## 8.6 sec <<< NOTE!
user 0m1.669s
sys 0m2.466s
## As regular user (victoria); I also use an alternate timing mechanism, as
## here I am using 2>/dev/null to suppress "Permission denied" warnings:
$ START="$(date +"%s")" && find 2>/dev/null / -path /mnt -prune -o \
-name "*libname-server-2.a*" -print; END="$(date +"%s")"; \
TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/usr/lib/libname-server-2.a
find command took 3 sec ## ~3 sec <<< NOTE!
... findet diese Datei in nur wenigen Sekunden, während dies viel länger dauert (scheint alle "ausgeschlossenen" Verzeichnisse zu durchlaufen):
## As sudo (#), to avoid numerous "Permission denied" warnings:
time find / -path /mnt/ -prune -o -name "*libname-server-2.a*" -print
find: warning: -path /mnt/ will not match anything because it ends with /.
/usr/lib/libname-server-2.a
real 33m10.658s ## 33 min 11 sec (~231-663x slower!)
user 1m43.142s
sys 2m22.666s
## As regular user (victoria); I also use an alternate timing mechanism, as
## here I am using 2>/dev/null to suppress "Permission denied" warnings:
$ START="$(date +"%s")" && find 2>/dev/null / -path /mnt/ -prune -o \
-name "*libname-server-2.a*" -print; END="$(date +"%s")"; \
TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/usr/lib/libname-server-2.a
find command took 1775 sec ## 29.6 min
Lösung 2
Die andere in diesem Thread angebotene Lösung ( SO # 4210042 ) weist ebenfalls eine schlechte Leistung auf:
## As sudo (#), to avoid numerous "Permission denied" warnings:
time find / -name "*libname-server-2.a*" -not -path "/mnt"
/usr/lib/libname-server-2.a
real 33m37.911s ## 33 min 38 sec (~235x slower)
user 1m45.134s
sys 2m31.846s
time find / -name "*libname-server-2.a*" -not -path "/mnt/*"
/usr/lib/libname-server-2.a
real 33m11.208s ## 33 min 11 sec
user 1m22.185s
sys 2m29.962s
ZUSAMMENFASSUNG | SCHLUSSFOLGERUNGEN
Verwenden Sie den in " Lösung 1 " dargestellten Ansatz.
find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
dh
... -path <excluded_path> -prune -o ...
Beachten Sie, dass /
der find
Befehl jedes Mal , wenn Sie das Trailing zum ausgeschlossenen Pfad hinzufügen , rekursiv (alle diese) /mnt/*
Verzeichnisse eingibt - was in meinem Fall aufgrund der /mnt/Backups/rsnapshot_backups/*
Unterverzeichnisse zusätzlich ~ 2,9 TB an zu durchsuchenden Dateien enthält! Wenn Sie kein Trailing anhängen, /
sollte die Suche fast sofort (innerhalb von Sekunden) abgeschlossen sein.
"Lösung 2" ( ... -not -path <exclude path> ...
) scheint ebenfalls rekursiv durch die ausgeschlossenen Verzeichnisse zu suchen - keine ausgeschlossenen Übereinstimmungen zurückzugeben, aber diese Suchzeit unnötig zu verbrauchen.
Suchen in diesen rsnapshot
Backups:
So finden Sie eine Datei in einem meiner stündlichen / täglichen / wöchentlichen / monatlichen rsnapshot
Backups):
$ START="$(date +"%s")" && find 2>/dev/null /mnt/Backups/rsnapshot_backups/daily.0 -name '*04t8ugijrlkj.jpg'; END="$(date +"%s")"; TIME="$((END - START))"; printf 'find command took %s sec\n' "$TIME"
/mnt/Backups/rsnapshot_backups/daily.0/snapshot_root/mnt/Vancouver/temp/04t8ugijrlkj.jpg
find command took 312 sec ## 5.2 minutes: despite apparent rsnapshot size
## (~4 GB), it is in fact searching through ~2.9 TB)
Ein verschachteltes Verzeichnis ausschließen:
Hier möchte ich ein verschachteltes Verzeichnis ausschließen, z. B. /mnt/Vancouver/projects/ie/claws/data/*
bei der Suche aus /mnt/Vancouver/projects/
:
$ time find . -iname '*test_file*'
./ie/claws/data/test_file
./ie/claws/test_file
0:01.97
$ time find . -path '*/data' -prune -o -iname '*test_file*' -print
./ie/claws/test_file
0:00.07
Nebenbei: Durch Hinzufügen -print
am Ende des Befehls wird der Ausdruck des ausgeschlossenen Verzeichnisses unterdrückt:
$ find / -path /mnt -prune -o -name "*libname-server-2.a*"
/mnt
/usr/lib/libname-server-2.a
$ find / -path /mnt -prune -o -name "*libname-server-2.a*" -print
/usr/lib/libname-server-2.a