grep
опции командыЯ хотел искать свой целый диск строку. После принятого ответа в Переполнении стека я использовал:
sudo time grep -rnw '/' -e 'Sony 50"'
и потребовалось 53 Часа для обработки 20 ГБ данных по одному из самого быстрого PCIe NVMe M.2 SSD вокруг; Samsung Pro 960.
grep
выходной журналКогда grep
процессы некоторые файлы это генерирует сообщения об ошибках. Они могут быть подавлены путем добавления 2>/dev/null
к команде. Однако ошибки дают обратную связь на сделанных успехах. Часть демонстрационного вывода (это не будет все соответствовать) ниже:
Binary file /home/Me/.config/google-chrome/Default/Sync Data/SyncData.sqlite3 matches
grep: /sys/kernel/security/ima/policy: Permission denied
grep: /sys/kernel/slab/:dt-0000008/alloc_calls: Function not implemented
grep: /sys/kernel/slab/:dt-0000008/free_calls: Function not implemented
(... SNIP ... 12 hours later PID 882 processed below...)
grep: /proc/882/task/922/attr/sockcreate: Invalid argument
grep: /proc/882/task/923/mem: Input/output error
(... SNIP ... 24 hours later PID 2954 below...)
grep: /proc/2598/attr/sockcreate: Invalid argument
grep: /proc/2954/task/2954/mem: Input/output error
(... SNIP ... 42 hours later PID 4396 below...)
grep: /proc/4389/attr/sockcreate: Invalid argument
grep: /proc/4396/task/4396/mem: Input/output error
(... SNIP ... After 53 hours `grep` finally finishes...)
grep: /run/user/1000/gvfs: Permission denied
Command exited with non-zero status 2
97355.34user 83223.12system 53:07:40elapsed 94%CPU (0avgtext+0avgdata 31116maxresident)k
593910020inputs+0outputs (1major+10731minor)pagefaults 0swaps
grep
производит впечатление, оно замораживаетсяИногда я думал grep
был заморожен, потому что экран не обновил в течение часа, и свет жесткого диска не высветился очень. Однако Носатый говорит мне, что это все еще выполняет и берет 100% ЦП на одноядерном, как замечено в этом GIF.
Из 19,5 гибибайт из 43,8 гибибайт, используемых на Linux (Ubuntu 16.04.3 LTS) раздел, половина этого пространства, 10 ГБ используются ядрами. Загрузка и тестирование ядер являются моим разовым передачей.
Этот тест взял большую часть моих выходных плюс понедельник для завершения.
Как я могу убыстриться grep
и все еще получите то, что я ищу?
Рассмотрение демонстрационного вывода регистрируется, мы видим, что виртуальные файловые системы включены в поиск, который является ненужной пустой тратой времени. Отбросьте эти и другие каталоги от поиска с --exclude-dir
опция. Например:
sudo time grep -rnw --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var} '/' -e 'Sony 50"'
Когда grep
синтаксические анализы /proc
цепочка каталога это бесполезно смотрит на весь идентификатор процесса, который занимает больше чем день в моем случае.
Также при обработке /mnt
это будет смотреть на смонтированные диски Windows NTFS и USBs излишне.
/media
хранения CD/DVD-привод и внешние карты памяти.
$ 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
Там Вы идете 56 Секунд вместо 50 Часов!
Отметьте, исключаете ли Вы usr
(содержащий 6,5 ГБ файлов в в моем случае) от поиска это - только 8 секунд:
4.48user 1.80system 0:08.75elapsed 71%CPU (0avgtext+0avgdata 6012maxresident)k
13008964inputs+0outputs (0major+1180minor)pagefaults 0swaps
Не допускание системных каталогов, кажется, сохраняет grep
на лучшей дорожке и это никогда не поражает 100% ЦП в одноядерное. Плюс вспышки света жесткого диска постоянно, таким образом, Вы знаете grep
действительно работает и "думает в кругах".
Если Вы не снабжаете префиксом tmp
с /
затем это проигнорирует любой подкаталог, содержащий tmp
например, /home/Me/tmp
. Если Вы используете - исключать-dir /tmp
затем Ваш каталог /home/Me/tmp
будет искаться.
Если, с другой стороны, Вы снабжаете префиксом sys
с /
затем затем /sys
каталог ищется, и об ошибках сообщают. То же верно для /proc
. Таким образом, необходимо использовать sys,proc
и не снабжают префиксом их /
. То же верно для других системных каталогов, которые я протестировал.
grepall
Рассмотрите установку псевдонима в ~/.bashrc
таким образом, Вы не должны вводить --exclude-dir
список параметров каждый раз:
alias grepall="grep --exclude-dir={boot,dev,lib,media,mnt,proc,root,run,sys,/tmp,tmpfs,var}"
Это разрывы раздела вниз, сколько времени сэкономлено путем возрастающего добавления каталогов к --exclude-dir
список параметров:
/proc
и /sys
сохранение 52 часов/media
сохранение 3 минут/mnt
сохранение 21 минуты/usr/src
(путем определения src
) сохранение 53 секунд/lib/modules
(путем определения modules
) сохранение 39 секунд/proc
и /sys
каталоги /proc
и /sys
каталоги являются самыми трудоемкими, самыми бесполезными, чтобы искать и генерировать большинство ошибок. Это "бесполезно", потому что эти два каталога динамично создаются во времени выполнения и не содержат постоянные файлы, Вы хотели бы grep
.
Прекрасное время, которое сбережения, понимает исключением их:
$ 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
Только 27 Минут эта экономия времени более чем 52 Часа!
Существуют все еще ошибки все же. В /var
каталог, который является также "виртуальным каталогом", созданным во время выполнения. /run
каталог, который содержит Сотовый телефон Android и /media
каталог, который содержит старый поврежденный жесткий диск для ноутбука, теперь подключенный к USB внешний корпус жесткого диска.
/media
исключить список /media
каталог содержит старый диск ноутбука, подключенный через порт USB 3.0. Ошибки ежедневных отчетов Smartctl на диске и не имеют файлов, которые мы ищем. Мы исключим его, чтобы сэкономить время и уменьшить сообщения об ошибках:
$ 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
Исключая неисправный жесткий диск, подключенный через корпус USB 3.0 только, сохранил 3 минуты, но уменьшил сообщения об ошибках.
/mnt
(Разделы Windows NTFS) для исключения списка /mnt
каталог содержит:
C:
и E:
) на SSD с 105 гибибайтами данныхD:
) на жестком диске с 42 гибибайтами данныхНет ничего из интереса к Windows, таким образом, мы исключим /mnt
сэкономить время:
$ 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
Теперь grep
только занимает 2 минуты и 8 секунд. Исключением разделов Windows 10 с 147 ГиБ Программ и Данных сохраняет 21,5 минуты!
/usr/src
Заголовки Linux для исключения списка /usr/src
каталог содержит исходный код Заголовков Linux. В моем случае существуют 20 + ядра, вручную установленные, который занимает значительное место. Указывать каталог, хотя используемый аргумент 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
Теперь grep только занимает 1 минуту и 15 секунд. Исключая /usr/src
путем определения src
на --exclude-dir
список сохраняет 53 секунды.
/lib/modules
Модули ядра для исключения списка /lib/modules
каталог содержит скомпилированные Модули Ядра. Указывать каталог, хотя используемый аргумент 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
Путем пропуска 6 ГБ модулей ядра, нашего grep
время составляет 36 секунд. Добавление /lib/modules
путем определения modules
в --exclude-dir
параметр сохраняет 39 секунд.
Сводный список других каталогов: