찾기 대 찾기


30

디스크에서 파일을 검색 하는 명령 find과 명령이 있습니다 locate.

필자는 find파일을 검색하기 위해 필요한 모든 하위 디렉토리를 재귀 적으로 처리하므로 속도는 느리지 만 최신 인 반면, locate매번 업데이트 된 데이터베이스 (정확히는?)를 사용하여 오래된 결과를 신속하게 보여줍니다.

다른 차이점이 있습니까? 어떤 상황에서 하나를 선호합니까? 그리고 locate데이터베이스는 보통 언제 업데이트됩니까?



1
manpages.ubuntu.com/manpages/trusty/man8/updatedb.8.html "updatedb는 일반적으로 기본 데이터베이스를 업데이트하기 위해 cron (8)에 의해 매일 실행됩니다."
Rinzwind

@Rinzwind 연결된 U & L 답변은 훌륭합니다. 교차 사이트 복제본을 만들 수 없다는 것은 부끄러운 일입니다. 그러나 크론 작업에 대해 정확히 언제 알 수 있습니까? 시작 후? 특정 시간에 (내가 1-2AM 또는 그와 비슷한 것을 읽은 것 같아)? 그때 시스템이 종료되면 어떻게됩니까? 컴퓨터가 유휴 상태 일 때 시작됩니까? 데이터베이스의 연령을 어떻게 알 수 있습니까?
바이트 사령관

2
@ByteCommander-그게 다야 anacron. 데스크톱 시스템 / 서버에 기본적으로 설치되어 있는지는 모르지만 노트북에는 설치되어 있습니다. 부팅시 실행되며 시스템이 꺼져있는 동안 cron 작업이 실행되어 있는지 확인합니다. 실제로 도움이되지만 자정에서 멀리 떨어진 작업을 예약하면 일부 문제가 발생할 수 있습니다. 이로 인해 부팅시 작업이 실행되고 시간이 다가 오면 다시 24 시간이 채 걸리지 않을 수 있습니다 (매일 작업의 경우).
Joe

@Joe 부팅 중에 실행되어 속도가 느려지거나 부팅 후 어느 정도 실행됩니까, 아니면 시스템이 거의 유휴 상태 일 때 실행되는 우선 순위가 낮은 것으로 실행됩니까?
바이트 사령관

답변:


27

locate실제로 파일을 찾아서 사람에게 표시하는 데 유용합니다. 그것으로 몇 가지 일을 할 수는 있지만 내부 데이터베이스의 상태를 보장하는 것은 불가능합니다 /etc/cron.daily/mlocate. 하루에 한 번만 실행되도록 예약되어 있기 때문에 내부 데이터베이스의 상태를 보장하는 것은 불가능합니다 !

find살아있다. 필터링, 제외, 실행합니다. 구문 분석에 적합합니다. 상대 경로를 출력 할 수 있습니다. 전체 경로를 출력 할 수 있습니다. 이름뿐만 아니라 속성을 기반으로 작업을 수행 할 수 있습니다.

locate확실히 내 도구 상자에 자리가 있지만 일반적으로 무언가를 찾기위한 마지막 도랑 노력으로 맨 아래에 있습니다. find너무 쉽다 .


2
나는 찾아 locate내 전체 파일 시스템을 검색 할 경우 훨씬 더 빨리 될 수 있습니다. 또한 사용 updatedb하기 전에 데이터베이스를 사용하여 수동으로 업데이트 할 수 있습니다 .
hytromo

그 cronjob이 정확히 어떻게 구성되어 있는지 알고 있습니까? 특정 시간 또는 시스템이 유휴 상태이거나 시작 후 n 분 동안 실행됩니까? 내 컴퓨터가 일반적으로 꺼져있을 때 1-2AM에 예약되어 있다고 읽었습니다. 수동 ( sudo updatedb)을 제외하고는 업데이트되지 않습니까? 그리고 데이터베이스가 몇 살인지 볼 기회가 있습니까?
바이트 사령관

grep run-parts /etc/crontab당신은 이것들이 관리되고 anacron있음을 보게 될 것입니다 (당신이 볼 man anacron수있는 것은 항상 그렇지 않은 시스템에 더 탄력적입니다). 내가 볼 수 있듯이 원래 cron 시간을 놓치면 부팅시 대신 실행해야합니다.
Oli

2
locate가 이동식 / 마운트되지 않은 파티션을 색인화하지 않는다는 것을 알았습니다. 따라서 파티션에서 무언가를 찾으려면 find를 사용해야합니다. 물론 locate에는 발견 된 모든 놀라운 옵션이 없습니다 -exec command {} \;. 발견 된 모든 파일에서 명령을 실행하는 것과 같습니다 . 나는 locate -b경로의 나머지 부분없이 이름의 최종 구성 요소와 일치하는 파일을 찾기 위해 찾기를 제한하는 것을 사용 하고 싶습니다 . 너무 빠르기 때문에 종종 먼저 시도합니다. 또한 sudo updatedb찾기 데이터베이스를 새로 고치려면 언제든지 실행할 수 있습니다.
Joe

다소 쉬운 실시간 검색이 필요한 경우 다음과 같이 사용할 수 있습니다.ls -R | grep 'file_name.txt'
jena

8

내가 Oli를 좋아하는만큼 (많습니다!) 나는 그 find명령 에 대해 그와 동의하지 않습니다 . 나는 그것을 좋아하지 않는다.

find 명령이 3 분 이상 걸립니다

이 간단한 명령을 예로 들어 보겠습니다.

$ 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

그것은 이상 소요 삼분find이르기까지 모든 시동을 검색 할를 /. 기본적으로 많은 양의 오류 메시지가 나타나고 원하는 것을 찾기 위해 해당 오류를 검색해야합니다. 여전히 grep전체 드라이브에서 53 시간 이 걸리는 문자열을 검색하는 것보다 낫습니다 : 문자열에 대한 모든 파일을`grep '하는 데 시간이 오래 걸립니다

find 명령의 매개 변수를 사용하여 더 잘 작동하도록 할 수 있지만 여기서 중요한 점은 실행하는 데 걸리는 시간입니다.

locate 명령은 1 초도 걸리지 않습니다

이제 사용하자 locate:

$ time locate mail-transport-agent.target
/lib/systemd/system/mail-transport-agent.target

real    0m0.816s
user    0m0.792s
sys     0m0.024s

위치 명령은 초 미만이 소요됩니다!

updatedb 기본적으로 하루에 한 번만 실행

찾기 데이터베이스updatedb 를 업데이트 하는 명령 은 기본적으로 하루에 한 번만 실행 되는 것이 사실 입니다. 다음을 사용하여 방금 추가 한 파일을 검색하기 전에 수동으로 실행할 수 있습니다.

$ time sudo updatedb

real    0m3.460s
user    0m0.503s
sys     0m1.167s

이 작업에는 3 초가 걸리지 만 find명령의 3 분 이상 에 비해 크기가 작습니다 .

sudo crontab -e맨 아래에 줄을 포함하도록 업데이트했습니다 .

# m h  dom mon dow   command
  0 0  1   *   *     /bin/journalctl --vacuum-size=200M
*/5 *  *   *   *     /usr/bin/updatedb

이제 5 분마다 updatedb실행되며 locate명령 데이터베이스는 거의 항상 최신 상태입니다.

그러나 속성이 없습니까?

locate다른 명령으로 출력을 파이프 할 수 있습니다 . 예를 들어 파일 속성을 원하는 경우 다음을 사용할 수 있습니다.

$ 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: -

개요

이 답변을 게시하여 속도와 사용 편의성을 보여줍니다 locate. 나는 다른 사람들이 지적한 몇 가지 단점을 해결하려고 노력했다.

find명령은 파일을 찾을 수있는 전체 디렉토리 구조를 탐색 할 필요가있다. 이 locate명령에는 자체 데이터베이스가있어 비교 속도가 뛰어납니다.


@EliahKagan 그러나 find 명령은 스크롤하여 모든 드라이브의 모든 디렉토리와 파일을 파티션으로 나열했습니다. 그것은 작동하는 것처럼 보였고 끝에 출력물을 기대하고있었습니다 ... 둘 중 하나는 find 명령의 검색을 "수정"하는 것이 아니 었습니다. 시간을 얻는 것에 관한 것이 었습니다. 실행 locate / display-auto-brightness에는 17 초가 걸리며 모든 디스크의 모든 디렉토리와 파일도 표시됩니다.
WinEunuuchs2Unix

@EliahKagan 이해합니다. --regex내 검색 문자열로 너무 많은 결과가 반환 되었기 때문에 필요했습니다. 몇 분 안에 답을 찾아서 업데이트하기위한 두 가지 새로운 예를 찾을 수 있습니다.
WinEunuuchs2Unix

1
것으로, 엘리야의 입장을 명확히하기 위해 find명령 수단은 "디렉토리에있는 모든 파일의 파일 이름 인쇄 /display-auto-brightness." 나는 당신이 사용하려고 생각 find / -name display-auto-brightness하지만, 심지어 많은 정크 "Permission denied"오류를 인쇄합니다.
wjandrea

@wjandrea 그렇습니다. 요점은 파일을 찾지 못한다는 것입니다. 캐시를 플러시 한 후 유효한 매개 변수로 테스트를 다시 실행하고 있습니다. 그런 다음 답변을 업데이트하겠습니다.
WinEunuuchs2Unix

1
@Win 아니오, 귀하의 예는 여전히 유효하며 파일의 발견 여부에 관계없이 처리 시간이 많이 변경되지는 않는다고 생각합니다.
wjandrea
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.