Virtuelle Dateisysteme ausschließen
Wenn wir uns das Beispielausgabeprotokoll ansehen, sehen wir, dass virtuelle Dateisysteme in die Suche einbezogen werden, was eine unnötige Zeitverschwendung darstellt. Löschen Sie diese und andere Verzeichnisse mit der --exclude-dir
Option aus der Suche . Zum Beispiel:
sudo time grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e 'Sony 50"'
Wenn grep
die /proc
Verzeichniskette analysiert wird, werden alle Prozess-IDs nutzlos angezeigt, was in meinem Fall mehr als einen Tag dauert.
Auch bei der Verarbeitung /mnt
werden unnötigerweise gemountete Windows NTFS-Laufwerke und USBs betrachtet.
/media
Hier befinden sich das CD / DVD-Laufwerk und externe USB-Laufwerke.
Ausgabe:
$ sudo time grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e 'Sony 50"'
Binary file /home/Me/.config/google-chrome/Default/Sync Data/SyncData.sqlite3 matches
11.35user 13.83system 0:56.35elapsed 44%CPU (0avgtext+0avgdata 8480maxresident)k
17369032inputs+0outputs (0major+1620minor)pagefaults 0swaps
Los geht's 56 Sekunden statt 50 Stunden !
Hinweis: Wenn Sie usr
(in meinem Fall 6,5 GB Dateien) von der Suche ausschließen, sind es nur 8 Sekunden:
4.48user 1.80system 0:08.75elapsed 71%CPU (0avgtext+0avgdata 6012maxresident)k
13008964inputs+0outputs (0major+1180minor)pagefaults 0swaps
Interessante Notizen
Das Heraushalten der Systemverzeichnisse scheint grep
besser zu bleiben und trifft niemals 100% der CPU auf einem einzelnen Kern. Außerdem blinkt die Festplattenanzeige ständig, damit Sie wissen, dass sie grep
wirklich funktioniert und nicht "im Kreis denkt".
Wenn Sie nicht das Präfix tmp
mit /
dann wird es jedes Unterverzeichnis enthält , ignoriert tmp
zum Beispiel /home/Me/tmp
. Wenn Sie --exclude-dir verwenden, /tmp
wird Ihr Verzeichnis /home/Me/tmp
durchsucht.
Wenn auf der anderen Seite Sie Präfix sys
mit /
dann dann /sys
Verzeichnis wird durchsucht und Fehler gemeldet. Gleiches gilt für /proc
. Sie müssen sie also verwenden sys,proc
und nicht voranstellen /
. Gleiches gilt für andere Systemverzeichnisse, die ich getestet habe.
Alias erstellen grepall
Richten Sie einen Alias ein, ~/.bashrc
damit Sie die --exclude-dir
Parameterliste nicht jedes Mal eingeben müssen:
alias grepall="grep --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var}"
Detaillierte Zeitaufschlüsselung
In diesem Abschnitt wird beschrieben, wie viel Zeit gespart wird, indem der --exclude-dir
Parameterliste schrittweise Verzeichnisse hinzugefügt werden:
/proc
und 52 Stunden/sys
sparen
/media
3 Minuten sparen
/mnt
21 Minuten sparen
/usr/src
(durch Angabe src
) 53 Sekunden sparen
/lib/modules
(durch Angabe modules
) 39 Sekunden sparen
Ausschluss /proc
und /sys
Verzeichnisse
Die Verzeichnisse /proc
und /sys
sind am zeitaufwändigsten und am nutzlosesten, um die meisten Fehler zu suchen und zu generieren. Es ist "nutzlos", da diese beiden Verzeichnisse zur Laufzeit dynamisch erstellt werden und keine permanenten Dateien enthalten, die Sie möchten grep
.
Eine große Zeitersparnis wird erzielt, indem sie ausgeschlossen werden:
$ sudo time grep -rnw --exclude-dir={proc,sys} '/' -e 'Garbage 098jfsd'
/var/log/auth.log:4653:Feb 16 17:46:20 alien sudo: rick : TTY=pts/18 ; PWD=/home/rick/Downloads ; USER=root ; COMMAND=/usr/bin/time grep -rnw --exclude-dir=proc --exclude-dir=sys / -e Garbage 098jfsd
Binary file /var/log/journal/d7b25a27fe064cadb75a2f2f6ca7764e/system.journal matches
grep: /media/rick/S3A6550D005/hiberfil.sys: Input/output error
(... SNIP ...)
grep: /media/rick/S3A6550D005/winproductkey: Input/output error
grep: /run/user/1000/gvfs: Permission denied
Command exited with non-zero status 2
422.43user 112.91system 26:59.03elapsed 33%CPU (0avgtext+0avgdata 31152maxresident)k
379671064inputs+0outputs (1major+10738minor)pagefaults 0swaps
Nur 27 Minuten, diesmal über 52 Stunden !
Es gibt jedoch immer noch Fehler. In einem /var
Verzeichnis, das auch ein zur Laufzeit erstelltes "virtuelles Verzeichnis" ist. Das /run
Verzeichnis, das ein Android-Handy enthält, und das /media
Verzeichnis, das eine alte kaputte Laptop-Festplatte enthält, die jetzt an ein externes USB-Festplattengehäuse angeschlossen ist.
Hinzufügen /media
, um die Liste auszuschließen
Das /media
Verzeichnis enthält ein altes Laptop-Laufwerk, das über einen USB 3.0-Anschluss angeschlossen ist. Smartctl meldet täglich Fehler auf dem Laufwerk und verfügt nicht über die gesuchten Dateien. Wir werden es ausschließen, um Zeit zu sparen und Fehlermeldungen zu reduzieren:
$ sudo time grep -rnw --exclude-dir={proc,sys,media} '/' -e 'Garbage 654asdf'
/var/log/auth.log:4664:Feb 16 18:26:27 alien sudo: rick : TTY=pts/18 ; PWD=/home/rick/Downloads ; USER=root ; COMMAND=/usr/bin/time grep -rnw --exclude-dir=proc --exclude-dir=sys --exclude-dir=media / -e Garbage 654asdf
Binary file /var/log/journal/d7b25a27fe064cadb75a2f2f6ca7764e/system.journal matches
grep: /run/user/1000/gvfs: Permission denied
Command exited with non-zero status 2
405.51user 105.38system 23:26.89elapsed 36%CPU (0avgtext+0avgdata 30908maxresident)k
365800875inputs+0outputs (0major+10961minor)pagefaults 0swaps
Mit Ausnahme der fehlerhaften Festplatte, die über ein USB 3.0-Gehäuse angeschlossen ist, wurden nur 3 Minuten eingespart, aber weniger Fehlermeldungen angezeigt.
Hinzufügen /mnt
(Windows NTFS-Partitionen) zum Ausschließen der Liste
Das /mnt
Verzeichnis enthält:
- Zwei NTFS Windows 10-Partitionen (
C:
und E:
) auf einer SSD mit 105 GB Daten
- Eine NTFS Windows 10-Partition (
D:
) auf einer Festplatte mit 42 GB Daten
Windows ist nicht von Interesse, daher schließen wir aus /mnt
, um Zeit zu sparen:
$ ll /mnt
total 44
drwxr-xr-x 5 root root 4096 Nov 12 07:19 ./
drwxr-xr-x 27 root root 4096 Feb 15 20:43 ../
drwxrwxrwx 1 root root 8192 Dec 30 14:00 c/
drwxrwxrwx 1 root root 8192 Dec 30 14:31 d/
drwxrwxrwx 1 root root 20480 Jan 1 13:22 e/
$ sudo time grep -rnw --exclude-dir={proc,sys,media,mnt} '/' -e 'Garbage zx5cv7er'
/var/log/auth.log:5093:Feb 17 10:31:44 alien sudo: rick : TTY=pts/18 ; PWD=/home/rick/Downloads ; USER=root ; COMMAND=/usr/bin/time grep -rnw --exclude-dir=proc --exclude-dir=sys --exclude-dir=media --exclude-dir=mnt / -e Garbage zx5cv7er
Binary file /var/log/journal/d7b25a27fe064cadb75a2f2f6ca7764e/system.journal matches
grep: /run/user/1000/gvfs: Permission denied
Command exited with non-zero status 2
51.50user 23.28system 2:08.85elapsed 58%CPU (0avgtext+0avgdata 15800maxresident)k
39866258inputs+0outputs (0major+6059minor)pagefaults 0swaps
Jetzt grep
dauert es nur noch 2 Minuten und 8 Sekunden. Durch das Ausschließen von Windows 10-Partitionen mit 147 Gib an Programmen und Daten werden 21,5 Minuten eingespart!
Fügen Sie /usr/src
Linux-Header hinzu, um die Liste auszuschließen
Das /usr/src
Verzeichnis enthält den Quellcode von Linux Headers. In meinem Fall sind mehr als 20 Kernel manuell installiert, was viel Platz beansprucht. So geben Sie das Verzeichnis an, obwohl das verwendete Argument lautet src
:
$ du -h -s /usr/src
3.2G /usr/src
$ sudo time grep -rnw --exclude-dir={proc,sys,media,mnt,src} '/' -e 'Garbage z5cv7er'
/var/log/auth.log:5096:Feb 17 10:34:28 alien sudo: rick : TTY=pts/18 ; PWD=/home/rick/Downloads ; USER=root ; COMMAND=/usr/bin/time grep -rnw --exclude-dir=proc --exclude-dir=sys --exclude-dir=media --exclude-dir=mnt --exclude-dir=src / -e Garbage z5cv7er
Binary file /var/log/journal/d7b25a27fe064cadb75a2f2f6ca7764e/system.journal matches
grep: /run/user/1000/gvfs: Permission denied
Command exited with non-zero status 2
44.21user 8.54system 1:15.51elapsed 69%CPU (0avgtext+0avgdata 15864maxresident)k
33754180inputs+0outputs (0major+6062minor)pagefaults 0swaps
Jetzt dauert grep nur noch 1 Minute und 15 Sekunden. Das Ausschließen /usr/src
durch Angabe src
in der --exclude-dir
Liste spart 53 Sekunden.
Fügen Sie /lib/modules
Kernelmodule hinzu, um die Liste auszuschließen
Das /lib/modules
Verzeichnis enthält kompilierte Kernelmodule. So geben Sie das Verzeichnis an, obwohl das verwendete Argument lautet modules
:
$ du -h -d1 /lib/modules
285M /lib/modules/4.14.18-041418-generic
282M /lib/modules/4.14.14-041414-generic
(... SNIP ...)
228M /lib/modules/4.9.76-040976-generic
6.0G /lib/modules
$ sudo time grep -rnw --exclude-dir={proc,sys,media,mnt,src,modules} '/' -e 'Garbage 1cv7fer'
/var/log/auth.log:5117:Feb 17 11:07:41 alien sudo: rick : TTY=pts/18 ; PWD=/home/rick/Downloads ; USER=root ; COMMAND=/usr/bin/time grep -rnw --exclude-dir=proc --exclude-dir=sys --exclude-dir=media --exclude-dir=mnt --exclude-dir=src --exclude-dir=modules / -e Garbage 1cv7fer
Binary file /var/log/journal/d7b25a27fe064cadb75a2f2f6ca7764e/system.journal matches
grep: /run/user/1000/gvfs: Permission denied
Command exited with non-zero status 2
19.22user 5.84system 0:35.61elapsed 70%CPU (0avgtext+0avgdata 15600maxresident)k
22111388inputs+0outputs (0major+6059minor)pagefaults 0swaps
Durch das Überspringen von 6 GB Kernelmodulen grep
beträgt unsere Zeit 36 Sekunden. Das Hinzufügen /lib/modules
durch Angabe modules
im --exclude-dir
Parameter spart 39 Sekunden.
Verschiedene Verzeichnisse
Zusammenfassende Liste anderer Verzeichnisse:
- / boot spart 3 Sekunden (aber meine ist außergewöhnlich groß)
- / dev spart 3 Sekunden
- / run spart 4 Sekunden
- / var spart 8 Sekunden
grep
jede einzelne Datei auf dem Computer verwenden würden ? Ich finde einen Benutzerfall, in dem eigentlich nichts über den Pfad oder Namen der Datei bekannt ist, sehr schwer vorstellbar - wenn dies der Fall ist, sollte diefind
Ausgabe von Pipinggrep
mitparallel
(oder die langsamere Alternativexargs
) der richtige Weg sein.