Tak bardzo, jak lubię Oli (co jest dużo!) Nie zgadzam się z nim na find
polecenie. Nie podoba mi się to
find
polecenie trwa ponad trzy minuty
Weźmy na przykład to proste polecenie:
$ time find / -type f -name "mail-transport-agent.target"
find: ‘/lost+found’: Permission denied
find: ‘/etc/ssmtp’: Permission denied
find: ‘/etc/ssl/private’: Permission denied
(... SNIP ...)
find: ‘/run/user/997’: Permission denied
find: ‘/run/sudo’: Permission denied
find: ‘/run/systemd/inaccessible’: Permission denied
real 3m40.589s
user 0m4.156s
sys 0m8.874s
To trwa ponad trzy minuty dla find
szukać wszystko począwszy od /
. Domyślnie pojawiają się ryzę komunikatów o błędach i musisz je przeszukać, aby znaleźć to, czego szukasz. Nadal jest lepsze niż grep
przeszukiwanie całego dysku w poszukiwaniu ciągu, który zajmuje 53 godziny : `grep`ing wszystkich plików w ciągu ciągu zajmuje dużo czasu
Wiem, że mogę manipulować parametrami polecenia find, aby działało to lepiej, ale chodzi tutaj o czas potrzebny do uruchomienia.
locate
polecenie zajmuje mniej niż sekundę
Teraz użyjmy locate
:
$ time locate mail-transport-agent.target
/lib/systemd/system/mail-transport-agent.target
real 0m0.816s
user 0m0.792s
sys 0m0.024s
Polecenie lokalizacji zajmuje mniej niż sekundę!
updatedb
domyślnie uruchamiany tylko raz dziennie
Prawdą jest, że updatedb
polecenie aktualizujące lokalizację bazy danych jest domyślnie uruchamiane tylko raz dziennie. Możesz uruchomić go ręcznie przed wyszukaniem właśnie dodanych plików, używając:
$ time sudo updatedb
real 0m3.460s
user 0m0.503s
sys 0m1.167s
Chociaż zajmie to 3 sekundy, jest to małe w porównaniu do find
3+ minut polecenia.
Zaktualizowałem mój, sudo crontab -e
aby zawierał wiersz u dołu:
# m h dom mon dow command
0 0 1 * * /bin/journalctl --vacuum-size=200M
*/5 * * * * /usr/bin/updatedb
Teraz co pięć minut updatedb
jest uruchamiana, a locate
baza danych poleceń jest prawie zawsze aktualna.
Ale nie ma atrybutów?
Możesz locate
przesyłać dane wyjściowe do innych poleceń. Jeśli na przykład chcesz atrybuty pliku, możesz użyć:
$ locate mail-transport-agent.target | xargs stat
File: '/lib/systemd/system/mail-transport-agent.target'
Size: 473 Blocks: 8 IO Block: 4096 regular file
Device: 10305h/66309d Inode: 667460 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-03-31 18:11:55.091173104 -0600
Modify: 2017-10-27 04:11:45.000000000 -0600
Change: 2017-10-28 07:18:24.860065653 -0600
Birth: -
Podsumowanie
Opublikowałem tę odpowiedź, aby pokazać szybkość i łatwość użycia locate
. Próbowałem poradzić sobie z niektórymi niedociągnięciami w dowodzeniu wskazanymi przez innych.
find
Komenda musi przemierzyć całą strukturę katalogów, aby znaleźć pliki. locate
Komenda ma własną bazę danych, która daje mu błyskawicznie w porównaniu.