파일 내용 대신 파일 이름을“grep”하는 방법은 무엇입니까?


135

grep은 파일 내에서 검색하여 주어진 정규식과 일치하는 행이 있는지 확인합니다. 그러나이 상황이 있습니다. 파일 이름 자체 (파일 내용이 아닌)와 일치하는 정규 표현식을 작성하고 싶습니다. 정규식과 일치하는 모든 파일을 찾기 위해 시스템의 루트 디렉토리에서 이것을 실행합니다.

예를 들어 "f"로 시작하고 .frm으로 끝나는 모든 VB 양식 파일을 찾으려면 정규식을 사용합니다.

   "f[[:alnum:]]*\.frm"

grep이 할 수 있습니까? 그렇지 않은 경우이 작업을 수행 할 수있는 유틸리티가 있습니까? 감사.

답변:


120

이 경우 find대신에 사용해야 합니다 grep.

당신은 또한 사용할 수있는 find조합으로 grep또는 egrep:

$ find | grep "f[[:alnum:]]\.frm"

12
이것은 불필요합니다. 찾기 기능에는 -regex옵션이 내장되어 있습니다.
whereswalden

4
여기서는 불필요하지만 grep은 perl 정규식을 지원하지만 find는 지원하지 않습니다.
Dan

2
아니요, grep을 사용할 수 있습니다. 찾기를 사용하는 것보다 훨씬 쉽습니다. "-rl"스위치를 추가하면 파일 대신 파일 이름이 검색됩니다. 아래 내 게시물을 참조하십시오.
RM

@ alpha_989, grep이 지원한다고 말 했는데 gnu.org/software/grep/manual/html_node/… grep에 파이핑하는 것은 pcre가 필요한 경우에만 필요합니다. whereswalden은 정답입니다
Dan

60

find <path> -name *FileName*

매뉴얼에서 :

이름 패턴 찾기

파일 이름의 기본 (리딩 디렉토리가 제거 된 경로) 쉘 패턴 패턴과 일치합니다. 선행 디렉토리가 제거되므로 -name과 일치하는 것으로 간주되는 파일 이름에는 슬래시가 포함되지 않으므로 "-name a / b"는 아무 것도 일치하지 않습니다 (대신 -path를 사용해야합니다). 메타 문자 ( "*", "?"및 "[]")는 "."와 일치합니다. 기본 이름의 시작 부분에서 (find-utils-4.2.2의 변경 사항입니다. 아래 표준 준수 섹션 참조). 디렉토리와 그 아래의 파일을 무시하려면 -prune을 사용하십시오. -path 설명의 예를 참조하십시오. Bash를 포함한 일부 쉘은 쉘 패턴에서 특별한 의미를 갖는 중괄호가 중괄호에 속한다는 사실에도 불구하고 중괄호는 특별한 것으로 인식되지 않습니다. 파일 이름 일치는 fnmatch (3) 라이브러리 함수를 사용하여 수행됩니다. 쉘에 의한 확장으로부터 패턴을 보호하기 위해 패턴을 따옴표로 묶는 것을 잊지 마십시오.


2
이 답변이 가장 유용하다는 것을 알았습니다. 몇 가지 추가 옵션을 추가했습니다. find . -maxdepth 1 -name "*filename*" -print
JSON C11

47

Pablo가 말했듯이 find대신 을 사용해야 grep하지만에 파이프 find할 필요는 없습니다 grep. find해당 기능이 내장되어 있습니다.

find . -regex 'f[[:alnum:]]\.frm'

find이름별로 파일을 검색하는 매우 강력한 프로그램으로 파일 유형별 검색, 깊이 제한, 다른 검색어와 부울 연산 결합 및 찾은 파일에 대한 임의의 명령 실행을 지원합니다. 자세한 내용 은 find 맨 페이지 를 참조하십시오.


1
나는 함께 날짜별로 검색과 발견의 매우 편리한 기능을 추가 -mtime하고-mmin
Johnride

1
또한 -regex 스위치는 전체 경로와 일치합니다. 따라서 예제를 사용하려면 정규식 시작 부분에. *를 추가해야합니다.
tumasgiu

15

grep을 사용하여 파일의 전체 경로를 찾을 수 있습니다. 트리의 출력을 파이프하십시오.

tree -f | grep filename

다음은 .bash_profile 또는 .bashrc에 넣을 수있는 함수입니다.

findfile(){ tree -f | grep $1; } # $1 = filename, -f is full path

-f는 선택 사항입니다.
jasonleonhard

10
find -iname "file_name"

Syntax :-
find -type type_descriptor file_name_here

type_descriptor 유형 :-

f : 일반 파일

d : 디렉토리

l : 심볼릭 링크

c : 문자 장치

b : 블록 장치


1
-type typedescriptor혼자 따르는 파일 이름을 사용할 수없는 것 같습니다 . 이것은 실수입니까?
Allan Nørgaard

5

당신은 또한 할 수 있습니다 :

tree | grep filename

그러면 트리 명령의 출력이 검색을 위해 grep됩니다. 파일이 존재하는지 여부 만 알려줍니다.


1

아니, grep은 이것을 위해 잘 작동합니다 :

 grep -rl "filename" [starting point]

 grep -rL "not in filename"

1
파일 내용에서 "filename"을 검색 한 다음 일치하는 파일 이름을 인쇄합니다. OP는 파일 내용이 아닌 일치하는 파일 이름을 원합니다.
Matthew

1
동의하면 파일 이름을 검색하지 않고 내용 과 일치 하는 파일 이름의 이름 만 인쇄합니다 . 옵션 -l-L옵션을 모두 잘못 이해했습니다 .
Prometheus

2
내가 정확히 필요한 것에 대한 +1. 나는 내가 필요한 답을 찾기 위해 질문을 비난 할 필요가 없었습니다
Alexander McNulty 2016 년

-1

여러 파일에도 적용됩니다.

tree /path/to/directory/ | grep -i "file1 \| file2 \| file3"

-1

가장 쉬운 방법은

find . | grep test

여기서 find는 (.)에있는 모든 파일, 즉 현재 디렉토리를 재귀 적으로 나열합니다. 그리고 그것은 단지 단순한 grep입니다. 이름이 "test"인 모든 파일이 나타납니다.

당신은 당신의 필요 조건에 의하여 grep로 놀 수 있습니다. 참고 : grep은 일반 문자열 분류이므로 파일 이름뿐만 아니라 결과도 얻을 수 있습니다. 그러나 경로에 디렉토리 ( '/xyz_test_123/other.txt')가 있으면 결과 세트에 나타납니다. 건배


경로에 "test"가있는 것을 찾을 수 있습니다 (예 :) ./foo/bar/latest/fred.txt.
Paul R

오. 내가 생각하지 못한 것. 언급 해 주셔서 감사합니다.
sachyy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.