Tak bardzo, jak lubię Oli (co jest dużo!) Nie zgadzam się z nim na findpolecenie. 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 findszukać 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ż grepprzeszukiwanie 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 updatedbpolecenie 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 find3+ minut polecenia.
Zaktualizowałem mój, sudo crontab -eaby 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 updatedbjest uruchamiana, a locatebaza danych poleceń jest prawie zawsze aktualna.
Ale nie ma atrybutów?
Możesz locateprzesył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.
findKomenda musi przemierzyć całą strukturę katalogów, aby znaleźć pliki. locateKomenda ma własną bazę danych, która daje mu błyskawicznie w porównaniu.