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

Book1 .

테스트에서 앞서 언급 한 파일을 찾으려고하는데이 테스트에서는 해당 파일의 위치를 알 수 없습니다.

p>

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

모르는 경우 명령 줄을 사용하여 book1이라는 파일을 찾으려면 어떻게해야합니까? 파일이 어디에 있습니까?

편집 :

내 시나리오가 설명되었습니다. 자세한 내용은 다음과 같습니다.

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

댓글

  • Book1, 읽을 수있는 디렉토리에 있으면 find / -iname book1에서 찾을 수 있습니다. Book1.xyz가 아니라 실제로 Book1입니까?
  • 파일의 전체 이름은 Book1입니다. gnumeric. 파일의 전체 이름을 지정해야한다는 건가요? 어떤 이유로이 특정 명령에 필요한 모든 ‘는 파일의 일반 이름이라고 생각했습니다. 내 테스트에서 파일을 찾으려고합니다. 예를 들어 ‘ 파일 확장자를 기억하지 못하고 파일 이름 만 아는 경우 ‘ 찾고 있습니다. 조언 해주세요.
  • @don_crissti 완료. 위의 수정을 참조하세요.
  • find locate를 혼합하고 있습니다. locate는 관대하며 일반적으로 매일 업데이트되는 데이터베이스에있는 한 일치하는 모든 항목을 찾습니다. 이 경우 findls에서 사용할 패턴 유형 인 파일 glob을 찾고 있습니다. 아마도 iname '*book1*'을 의미 할 것입니다. find가 패턴을보기 전에 셸이 확장되지 않도록하려면 패턴이 따옴표 안에 있어야합니다. 또한 많은 * nix 명령과 마찬가지로 find는 실패 할 때 실망스럽게 침묵합니다.

답변

먼저, -iname에 대한 인수는 쉘 패턴 입니다. 패턴에 대한 자세한 내용은 Bash 설명서 를 참조하세요. 요점은 find가 실제로 파일을 찾으려면 파일 이름이 지정된 패턴과 일치해야한다는 것입니다. 대소 문자를 구분하지 않는 문자열 book1Book1.gnumeric와 일치하도록하려면 *를 추가해야합니다. 다음과 같이 표시됩니다.

find / -iname "book1*" 

또는 전체 이름 지정 :

find / -iname "Book1.gnumeric" 

초 , -inamefind가 파일 이름 대소 문자를 무시하도록하므로 -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 

댓글

Answer

locate 명령을 사용할 수 있습니다. 파일 이름 데이터베이스를 사용합니다. 더 빨리 검색 할 수 있습니다.

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

locate -i book1 

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

locate -i "book1*" 

find보다 훨씬 빠르지 만 데이터베이스를 마지막으로 새로 고친 시점만큼만 최신 상태입니다.

댓글

  • 어떤 출력도 생성되지 않았습니다. locate -i after.sh, sudo locate -i "after.sh", sudo locate -i after.sh, sudo locate -i '*after.sh'

답변

book1.something라는 파일이 있다는 것을 알고있는 경우, 파일 위치는 something의 정확한 값입니다. , 파일 이름의 대소 문자 패턴은 모두 알 수 없습니다.

find / -iname "book1.*" 

확실히 알고있는 것은 파일 이름에 ,

find / -iname "*book*" 

-name는 쉘 glob 패턴입니다. 파일이있는 디렉토리에서 다음을 비교합니다.

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

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

Answer

POSIXly,

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

이름에 book1가 포함 된 모든 파일의 경로를보고합니다 (대소 문자 변형 포함). , 그러나 𝗄, 𝚔

만 고려합니다. ,𝘬,,,,및 분음 부호가있는 모든 변형 …) 읽기 액세스 권한이있는 모든 디렉토리에 있습니다.

답변

Zsh를 사용하면 glob 패턴을 사용할 수 있으므로 이것도 작동합니다.

ls -a /**/book1 

book1라는 파일이있는 모든 위치를 찾으세요.

내 테스트에서는

, 루트 권한없이 실행할 때 사용자 권한 오류 가 거의 또는 전혀 발생하지 않습니다.

manual .

Answer

저는 항상 이런 종류의 작업을 수행합니다. find / -iregex ".*Book1.*"

이 양식은 시나리오의 세 가지 사항을 처리합니다 (iregex는 대소 문자를 구분하지 않는 합리적인 표현이며 패턴은 .* 양쪽의 고정 된 Book1 패턴 앞뒤의 모든 문자와 일치합니다. 이것은 분명히 필요한 것보다 더 많은 결과를 제공 할 수 있지만 파일을 놓치지 않을 것입니다)

주요 차이점 : 가능한 경우 /를 사용하는 것보다 더 제한적입니다 (예 : /home 등). 관련이없는 일부 디렉토리 (/sys, /dev 등…)로 내려갑니다.

하지만 유닉스 권한 적용 : 파일이 find 명령을 실행하는 사용자에게 액세스 (실행) 권한이없는 디렉토리에있는 경우 find가 찾을 수 없습니다.

댓글

  • iregex가 획득 한 ‘ Solaris (OS가 지정되지 않음) (및 가능하면 * BSD), GNU 확장이며 표준 find

답변

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

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

ag -g Book1

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

Answer

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 

찾는 경우 유효하지 않다 lable, 대신 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를 포함하지 않으면

/sys, 특히 루트가 아닌 경우 화면에 오류가 발생하는 경향이 있습니다.(오류는 찾기 명령 끝에 2> /dev/null를 추가하여 숨길 수 있습니다 (주석은 제거해야 함))

여러 파티션이 있고 그렇지 않은 경우 ” 파일이 어떤 파일에 있는지 알면 lsblk 목록을 얻을 수 있습니다 (Linux 기반 OS에서는 df 출력 구문 분석). 그렇지 않으면 옵션)을 입력하여 find : (파일에 액세스 할 수 있는지 모르는 경우 다시 루트)

$ 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 매개 변수를 조정해야 할 수 있습니다. -P는 GNU df가 표준 POSIX 출력을 제공하도록합니다. 기타 버전에는 다른 매개 변수가 있거나 생략해야 할 수 있습니다. 맨 페이지를 읽으십시오.)

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

비 GNU 버전에서 awk는 마운트가 /dev로 시작하는 장치를 찾아 실제 파일 시스템을 가져온 다음 마지막 파일을 인쇄합니다. d (마운트 지점)는 df 출력입니다.

또한 bourne과 같은 쉘 (kshbash가 작동합니다. csh 변형을 사용하는 경우 시도하기 전에 스크립팅 가능한 셸 을 시작하세요)

댓글

답변

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 배 이상 빠릅니다.

Answer

find / -type f -iname "book[0-9].*" 

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다