찾기 대 찾기


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.