이름의 일부만 검색하여 파일을 찾는 명령?


32

이름이있는 파일이 있다고 가정하십시오.

batman.c
debate.c
cricketbat.c

searchtag를 사용하여 이러한 모든 파일을 나열하려면 어떤 명령을 어떻게 사용해야 bat합니까?


5
현재 디렉토리에만 일치하는 파일을 나열 하시겠습니까? 현재 디렉토리 또는 그 아래의 디렉토리에 있습니까? 시스템 어딘가에?
스틸 드라이버

답변:


47

bat어디서나 파일 찾기

내부 /path/to/folder에 이름이 포함 된 모든 파일을 찾으려면 bat다음을 사용할 수 있습니다.

find /path/to/folder -name '*bat*'

나는 한 인용 검색 패턴을 *bat*따옴표 생략하고 파일이 일치한다면, 때문에 *bat*현재 디렉토리, 쉘이 확대 될 *bat*그들의리스트로하고 통과 에게 find. 그렇다면 find제대로 작동하지 않습니다. ( \*bat\*그리고 "*bat*"작동합니다.)

현재있는 폴더 (예 : cded 폴더)를 검색하려면 .평소와 같이을 사용하십시오.

find . -name '*bat*'

전체 컴퓨터를 검색하려면을 사용하십시오/ . 홈 디렉토리를 검색하려면을 사용 ~하거나 홈 디렉토리 의 전체 이름을 사용하십시오. ( 쉘은 확장~ 홈 디렉토리의 완전한 경로에.)

이름을 기준으로 검색 범위 확대 또는 축소

당신이 파일을 포함하므로, 대문자와 소문자를 구별하지 않고로 검색 할 경우 BAT, bAt일치하는 등, 그리고, 사용 -iname대신의 시험 -name테스트를 :

find /path/to/folder -iname '*bat*'

모든 파일이로 끝나는 것을 발견했습니다 .c. 그런 파일 만 찾으려면 다음을 사용하십시오.

find /path/to/folder -name '*bat*.c'

모든 파일 이름이 접미사 bat앞 부분의 맨 처음 또는 끝에 .c있습니다. 과 같은 파일이 일치하지 않게하려면 embattled.c다음을 사용할 수 있습니다.

find /path/to/folder -name '*bat.c' -o -name 'bat*.c'

-o는 IS 또는 오퍼레이터.

파일 만 일치

폴더, 기호 링크 및 특수 장치 노드가 아닌 일반 파일 만 찾으려면 을 사용할 수 있습니다 -type f. 이것은 종종 권장되고 때로는 적절하지만 ... 특히 출력을 직접 검사하기 위해 실행하는 경우에는 실제로 원하는 것이 아닙니다find . 검색어와 일치 하는 심볼릭 링크 가 있다면 알고 싶지 않습니까?

일반 파일과 심볼릭 링크를 모두 찾으려면 다음을 사용할 수 있습니다.

find /path/to/folder -name '*bat*' \( -type f -o -type l \)

이것은 -o연산자와 그룹화를 위해 괄호를 사용합니다 (쉘은 특수하게 처리하지 않도록 인용해야합니다. 그렇지 않으면 구문 오류가 발생합니다).

그러나 최종 파일을 가리키는 심볼릭 링크 만보고 싶다고 가정합니다 (디렉토리, 장치 노드 등에 대한 심볼릭 링크는 아님). 실제로 더 간단합니다. -xtype대신 사용하십시오 -type. 실행하지 않는 제공 find과 함께 -L, 플래그 -xtype심볼릭 링크하는 것은 링크 포인트에 파일의 유형을 테스트합니다.

find /path/to/folder -name '*bat*' -xtype f

파일에 대한 다른 심볼릭 링크에 대한 심볼릭 링크가 있으면 직접 대상이 일반 파일이 아닌 다른 심볼릭 링크 인 -xtype f경우에도 해당 파일 과 일치 합니다. 이것은 거의 항상 당신이 원하는 것입니다.

종종 사람들은 그들이 원한다고 생각 -type f하지만 실제로는 원합니다 -xtype f.

자세한 출력 얻기

find하나를 지정하지 않으면 기본 조치는 -print입니다. 위에 주어진 모든 명령 -print은 끝에 붙인 상태와 동일합니다 .

find발견 된 파일을 기반으로 명령을 실행하는 데 종종 사용되며 종종 변경을 수행하는 명령입니다. 그러나 이외에도 결과를 표시하기위한 다른 작업도 -print있습니다. 특히 관심입니다 -ls:

find /path/to/folder -name '*bat*' -ls

이를 통해 각 파일에 대한 자세한 정보를 여러 열 형식으로 표시 할 수 있습니다 .ls file

추가 자료

find파일을 찾는 방법과 다른 방법 에 대한 자세한 내용 은 다음을 참조하십시오.


1
큰 답변, 특히 -xtype조언; 아마도 ls *bat*그리고 -maxdepth/ mindepth또한 언급 할 가치가 있습니다.
mklement0

2
@ mklement0 감사합니다! OP는 파일의 위치와 재귀의 필요 여부에 대한 설명을 아직 제공 하지 않았습니다 . 혼돈의 답변ls이미 다뤄 듯이 find여기 에서 재귀 사건에 집중했습니다 . 물론, 상세한 대답은 몇 가지 패턴과 일치하는 파일 이름의 -recursive 목록을 비를 덮고 (이하) ( lsfind함께 -maxdepth)도 유용 할 것이다. 당신은 그런 답변을 게시 할 수 있습니다!
Eliah Kagan

16

가장 쉬운 방법은 달리는 것입니다

locate bat

이렇게하면 파일 이름에 "bat"가 포함 된 파일을 전체 컴퓨터에서 검색 할 수 있습니다.

PC에서 파일 목록을 새로 고치려면

updatedb

최근에 계정에 새 파일을 추가 한 경우이 명령을 실행하십시오.


1
필요updatetdb
Sergiy Kolodyazhnyy

4
@Serg 새 파일을 찾으려면 ( updatedb마지막으로 수동 또는 자동으로 마지막으로 실행 된 시간보다 최신 ) sudo updatedb먼저 실행해야합니다.
Eliah Kagan

이름 전체가 일치하는지 전체 시스템을 검색합니다 bat.
terdon

1
@ terdon 나는 이미 대답으로 이것을 언급했지만, 내가 이것을 언급했을 때 그것이 다운 투표를받을 가치가 있다고 생각하지 마십시오.
Mark Kirby

1
이 훨씬 빨리보다 참고 find /locate하면서, 데이터베이스에서 검색을 find반복적으로 나열 /다음과 정규식과 일치합니다.
Timothy Gu

14

터미널을 열고 검색을 시작하려는 디렉토리로 디렉토리를 변경 한 후 다음 명령을 실행하십시오.

find . -name "*bat*" -type f 

.현재 디렉토리에서 찾기 명령을 시작합니다.
-name문자열과 일치 bat하고 대소 문자를 구분합니다. ( -iname경우를 구분하지 않습니다) 파일 만 검색합니다.
-type f


삭제 및 삭제 취소? ok +1 : P;)
AB

6

파일이 현재 디렉토리에있는 경우 다음을 사용하십시오.

$ ls *bat*
batgirl.c  batman.c  batwoman.c  cricketbat.c

또는 (한 줄씩) :

$ ls -1 *bat*
batgirl.c
batman.c
batwoman.c
cricketbat.c

해당 파일을 시스템에서 검색하려면 다음을 사용하십시오.

$ find / -name "*bat*"
/path/to/cricketbat.c
/path/to/batgirl.c
/path/to/batwoman.c
/path/to/batman.c

1
루트 디렉토리로 검색을 시작하면 sudo를 추가 할 수 있습니다.이 명령은 일부 폴더에 대해 '권한 거부'를보고합니다.
Sergiy Kolodyazhnyy

4

대소 문자를 구분하지 않는 파일 이름 일치 옵션 또는 대소 문자를 구분하는 파일 이름 일치 옵션 find과 함께 명령 을 사용하려고합니다 . 둘 다 와일드 카드 이름을 사용할 수 있습니다. 따라서 "bat"가 포함 된 파일 이름을 찾으려면 다음을 사용하십시오.-iname-name

find / -iname '*bat*'

또는

find / -name '*bat*'

*수단 검색이 찾고되도록 "모든 문자 (들)", bat앞이나 뒤에, 아무도가없는 경우를 포함하여 모든 문자와 함께. /루트 디렉토리에서 검색이 반복적으로, 당신이 사용할 수있는 .현재 디렉토리, 또는에서 검색 할 위치의 절대 경로에서 재귀 적으로 검색 할를. 리눅스 쉘 스크립트에서 정규 표현식을 사용하여 파일을 검색하는 방법을 살펴보십시오.


@ EliahKagan 감사합니다. 저는 답변에 더 많은 정보를 추가했습니다.
AJefferiss

+1 편집 해 주셔서 감사합니다. IMO 그것은 것을이 답변의 강도 피한다 의 무분별한 사용을 권장 -type f단순히 제외 디렉토리보다 더 수행하고있다, 사용자가 진정으로 원하는하지 무엇 자주는 .
Eliah Kagan

2

좋은 오래된 것을 사용하십시오 find.

find <path_for_search> -type f -iname "*bat*" 

예 :

% find . -type f -iname "*bat*" 
./batgirl.c
./batwoman.c
./cricketbat.c
./batman.c

부터 man find:

-type c
          File is of type c:
          [..]
          d      directory
          [..]
          f      regular file
          [..]

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