모든 디렉토리에서 파일을 찾는 방법 명령 행을 사용하여 book1이라는 파일을

Book1 이라는 파일을 찾으려고합니다 .

내 테스트에서 위에서 언급 한 파일을 찾으려고 하는데이 테스트에서 해당 파일이 어디에 있는지 모르겠습니다.

시도 find / -iname book1했지만 출력이 없습니다.

파일의 위치를 ​​모르는 경우 명령 행을 사용하여 book1이라는 파일을 어떻게 찾을 수 있습니까?

편집하다:

내 시나리오는 아래에 더 자세히 설명되어 있습니다.

  1. 파일 확장자를 알 수 없습니다
  2. 정확한 이름 (예 : 대문자, 숫자 등)을 알 수 없음
  3. 파일의 위치를 ​​알 수 없음


답변

먼저에 대한 인수 -iname는 쉘 패턴 입니다. Bash manual 에서 패턴에 대한 자세한 내용을 읽을 수 있습니다 . 요점은 find실제로 파일을 찾으 려면 파일 이름이 지정된 패턴과 일치해야한다는 것입니다. 대소 문자를 구분하지 않는 문자열을 book1일치 시키려면 다음과 같이 Book1.gnumeric추가 *해야합니다.

find / -iname 'book1*'

또는 전체 이름을 지정하십시오.

find / -iname 'Book1.gnumeric'

둘째, -iname만들 것이다 find지정하면 이렇게 파일 이름 케이스를 무시 -iname book1가도 찾을 수 있습니다 Book1, bOok1당신은 당신이라고 찾고 있는지 파일 경우 등을 Book1.gnumeric
사용하지 않는 다음 -iname하지만 -name더 빠르게 될 것입니다 :

find / -name 'Book1.gnumeric'

셋째, 다른 답변 에서 언급 한대로 패턴을 인용하는 것에 대해 기억하십시오 .

그리고 마지막으로- 시스템의 어느 곳에서나 파일을 찾고 싶
습니까? 찾고있는 파일이 실제로 $HOME작업했거나 다른 곳에서 다운로드 한 경우 디렉토리에있을 수 있습니다. 다시 말하지만, 훨씬 빠를 수 있습니다.

편집 :

질문을 편집 한 것으로 나타났습니다. 전체 파일 이름, 대문자 및 위치를 모르는 경우 다음과 같이 사용해야합니다.

find / -iname 'book1*'

또한 루트가 아닌 사용자로 호출 할 경우 나타날 2>/dev/null모든 *permission denied*오류 및 기타 오류 를 숨기려면 줄 끝에 두는 것이 좋습니다 find.

find / -iname 'book1*' 2>/dev/null

그리고 단일 파일을 찾고 있다고 확신하고 시스템 find에 첫 번째 일치하는 파일을 찾은 후 종료하도록 지시 할 수있는 기준과 일치하는 단일 파일 만있는 경우 :

find / -iname 'book1*' -print -quit 2>/dev/null

답변

locate명령을 시도 할 수 있습니다 . 검색 속도를 높이기 위해 파일 이름 데이터베이스를 사용합니다.

일치하는 모든 파일을 검색 *book1*하고 대소 문자를 무시하려면

locate -i book1

시작 하는 파일을 검색 book1하려면 와일드 카드를 직접 수행해야합니다.

locate -i 'book1*'

보다 빠르지 find만 데이터베이스를 마지막으로 새로 고쳤을 때만 최신 상태입니다.


답변

당신은 당신이라는 파일이 알고있는 경우 book1.something파일 위치의 정확한 값, something및 파일 이름의 대소 문자 패턴이 모두 알을 :

find / -iname 'book1.*'

당신이 확실히 알고있는 모든 파일 이름이 단어를 포함하는 경우 book, 당신은있는 가능성이 훨씬 더 큰 목록을 생성 할 수 있습니다

find / -iname '*book*'

의 인수 -name는 쉘 글로브 패턴입니다. 파일이있는 디렉토리에서 다음을 비교하십시오.

$ ls Book1
ls: cannot access 'Book1': No such file or directory
$ ls Book1.*
Book1.gnumeric

에 의해 수행되는 검색 종류를 나타냅니다 -name. 이 -iname옵션은 대소 문자를 구분하지 않는 버전을 허용합니다.


답변

POSIXly,

LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'

이름에 포함 된 모든 파일의 경로를보고합니다 book1(사건의 어떤 변화에 있지만, 오직 ASCII 라틴 문자 생각 bokBOK처럼 유니 코드가 아닌 다른 많은 변화를 ?, ?, ?, , , , 그들의 모든 변화 … 분음 부호)에서 읽기 권한이있는 모든 디렉토리


답변

이러한 종류의 작업을 위해 나는 항상 다음을 수행합니다. find / -iregex '.*Book1.*'

이 양식은 시나리오의 세 가지 점을 처리합니다 ( iregex대소 문자를 구분하지 않는 합리적인 표현이며 .*양쪽에있는 패턴은 Book1의 고정 패턴 전후에 어떤 문자와 일치합니다. 이는 분명히 필요한 것보다 더 많은 결과를 줄 수 있습니다 그러나 당신은 파일을 놓치지 않을 것입니다)

가장 큰 차이점은 : 가능하면 바로 사용하는 것보다 더 제한적으로 /만 시도처럼, /home그렇지 않으면 당신은 관련이없는 일부 디렉토리에 내려 것, 정도 ( /sys, /dev, 등 …)

그러나 Unix 권한이 적용됩니다. 파일이 find명령을 실행하는 사용자에게 액세스 (실행) 권한이없는 디렉토리에 있으면 파일 find을 찾을 수 없습니다.


답변

Silver Searcher 는 파일과 콘텐츠를 검색 할 수있는 매우 빠르고 편리한 유틸리티입니다.

문제를 해결하기 위해 silver searcher 명령은 다음과 같습니다.

ag -g Book1

-g PATTERN PATTERN과 일치하는 파일 이름 인쇄


답변

locate 그리고 그 변형은 빠른 방법 인 경향이 있습니다.

# updatedb # run as root, possibly using sudo, e.g. sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped
$ locate -i book1

찾기를 사용할 수없는 경우 find대신 사용할 수 있습니다 . 훨씬 느리지 만 더 정확한 경향이 있습니다.

단일 파티션이있는 경우 : (사용자가 파일에 액세스 할 수없는 경우 루트로 실행)

$ find / -xdev -iname 'book1*' -print # If the iname extension to find is available
$ find / -xdev -print | grep -F -i /book1 # if iname is not available

당신은 포함하지 않는 경우 -xdev find다른 같은 파티션에 검색 것들 /proc/sys당신이 루트가 특히 오류가있는 화면을 범람하는 경향이있다. ( 2> /dev/null찾기 명령 끝에 주석 을 추가하여 오류를 숨길 수 있습니다 (주석을 제거해야 함))

파티션이 여러 개이고 파일이있는 파티션을 모르는 경우 lsblk(Linux 기반 OS의 경우 구문 분석 df출력은 옵션 임)를 사용 하여 목록을 가져 와서 찾은 위치에 넣을 수 있습니다. 파일에 액세스 할 수 있는지 모르겠습니다)

$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname 'book1*' -print # GNU-based OSes
$ find $(df -P|awk '$1 ~ /^\/dev/ {print $NF}') -xdev | grep -F -i book1 # Non-GNU based OSes.

((당신의 마운트 포인트 중 하나가에 공백이있는 경우이 조금 약해) df매개 변수는 GNU가 있습니다 -P. 조정이 필요할 수 있습니다 df. 표준 POSIX 출력을주고 다른 버전이 다른 매개 변수를가하거나 탈락 할 수도 있습니다. 당신의 남자 페이지를 참조)

grep -F스왑 파티션과 같이 반환 된 다른 항목 은 제외됩니다.

GNU 이외의 버전에서 awk /dev는 실제 파일 시스템을 가져 오기 위해 마운트가있는 장치를 찾은 다음 출력에서 ​​마지막 필드 (마운트 포인트)를 인쇄합니다 df.

이것은 또한 본쉘 같은 가정 ( ksh그리고 bash당신이 사용하는 경우. 작업을해야 csh변형을하는 시작 스크립트 쉘을 당신이 시도하기 전에)