모든 디렉토리에서 파일을 찾는 방법


22

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

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

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

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

편집하다:

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

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

2
이라는 파일 Book1이 있고 읽을 수있는 디렉토리에 있으면 find / -iname book1찾을 수 있습니다. 실제로 Book1그렇지 Book1.xyz않습니까?
Fox

.gnumeric의 전체 파일명은 Book1.gnumeric입니다. 파일의 전체 이름을 지정해야한다고 말씀하십니까? 어떤 이유로 나는이 특정 명령에 대해 필요한 것은 파일의 일반 이름이라고 생각했습니다. 예를 들어 파일 확장명을 기억하지 않고 찾고있는 파일 이름 만 알고 있으면 테스트에서 파일을 찾으려고합니다. 조언 부탁드립니다.
Aspire27

@don_crissti 완료. 위의 편집을 참조하십시오.
Aspire27

당신은 혼합 find 하고 locate있습니다. locate관대하며 데이터베이스에있는 한 일반적으로 매일 업데이트되는 일치하는 항목을 찾습니다. find이 경우, 사용할 패턴과 같은 파일 글로브를 찾고 있습니다 ls. 당신은 아마 의미 iname '*book1*'합니다. 쉘이 그것을보기 전에 확장하는 것을 막으려면 패턴이 따옴표 안에 있어야 find합니다. 또한 find많은 * nix 명령과 마찬가지로 실패 할 경우 매우 조용합니다.
Manngo

답변:


31

먼저에 대한 인수 -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


6

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

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

locate -i book1

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

locate -i 'book1*'

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


5

당신은 당신이라는 파일이 알고있는 경우 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옵션은 대소 문자를 구분하지 않는 버전을 허용합니다.


1

POSIXly,

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

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


0

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

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

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

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


iregex 것이다 솔라리스 같은 장소에서하지 작업 (OS가 지정되지 않았습니다) (그리고 아마도 * BSD)는 GNU 확장이다과의 일부가 아닌 표준find
버그 서재 거트 반

0

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

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

ag -g Book1

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


0

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변형을하는 시작 스크립트 쉘을 당신이 시도하기 전에)


grep의 약간의 소음이 수도 를 필터링하는 방법은 더 나은 (이이 예제를 필요로하지 않아야하지만,가보고되는 일반적인 일이되면, greps는 소음 수준 아래로 유지하기 위해 조정을해야합니다)
거트를 van den Berg

0

ag (은 검색기) 는 파일에서 매우 빠른 검색을 제공하며 파일 이름을 검색하는 옵션도 있습니다.

>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m0.884s
user    0m0.701s
sys     0m0.178s

>: time find . -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m29.744s
user    0m2.108s
sys     0m13.982s

>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m16.698s
user    0m1.951s
sys     0m7.119s

따라서 내 유스 케이스에서는 파일이 ag에 의해 무시되는 파일이 아닌 경우 30 배 이상 빠릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.