이름이 문자열 인 모든 파일 찾기


177

파일 이름에 문자열이 포함 된 현재 디렉토리에서 파일을 반환하는 명령을 찾고 있습니다. 내가 본 locatefind찾을 수있는 명령 파일은 무엇인가로 시작 first_word*또는 무언가로 끝나는 *.jpg.

파일 이름에 문자열이 포함 된 파일 목록을 어떻게 반환합니까?

예를 들어, 2012-06-04-touch-multiple-files-in-linux.markdown현재 디렉토리의 파일 인 경우 입니다.

이 파일과 문자열을 포함하는 다른 파일을 어떻게 반환 할 수 touch있습니까? 다음과 같은 명령 사용find '/touch/'


문제는 혼란 스럽다. 문자열이 포함 된 파일 또는 이름에 해당 문자열이 포함 된 파일을 찾으 시겠습니까? 첫 번째 질문은로 대답 man grep하고 두 번째 질문은로 대답 man find합니다. 왜 남자를 사용하는 대신 구글을 하시겠습니까?
그냥 누군가

1
감사! 첫 번째 문장은 파일 내용인지 파일 이름인지를 지정하지 않았습니다. 업데이트되었습니다.
Dru

답변:


303

사용 find:

find . -maxdepth 1 -name "*string*" -print

maxdepth 1"string"을 포함 하는 현재 디렉토리에서 모든 파일을 찾고 ( 재귀 적이라면 삭제 ) 화면에 인쇄합니다.

':'이 포함 된 파일을 피하려면 다음을 입력하십시오.

find . -maxdepth 1 -name "*string*" ! -name "*:*" -print

사용하고 싶지만 grep(파일 내용을 확인하고 싶지 않은 한 필요하지 않다고 생각하는 경우) 다음을 사용할 수 있습니다.

ls | grep touch

그러나 반복 find합니다. 귀하의 작업에 더 좋고 깨끗한 솔루션입니다.


@Zagorax에게 감사합니다. 정확히 그렇습니다. 명령이 너무 길지는 않았지만 ayee :)
Dru

2
@Dru, 콜론을 피하려면 케이스를 덮도록 수정되었습니다. find매우 강력한 도구이므로 어떻게 든 '길어야'합니다. :)
Zagorax

첫 번째 것은 내용을 반환하지 않고 완벽하게 수행 한 것입니다.
Dru

3
@Dru, '더 짧게'원하면 이것이 -print기본 동작 .이므로 이것이 확인되는 기본 폴더이므로 피할 수 있습니다 .
Zagorax

1
find . -name "*string*"잘 작동합니다. 제거하면 .내 오류가 발생합니다. 다시 @Zagorax에게 감사드립니다.
Dru

14

다음과 같이 grep을 사용하십시오.

grep -R "touch" .

-R재귀를 의미합니다. 하위 디렉토리로 들어 가지 않으려면 생략하십시오.

-i"대소 문자 무시"를 의미합니다. 시도해 볼 가치가 있습니다.


큰. 일부 파일 내용이 :. 어쨌든 그것을 보류 할 수 있습니까? 아마도 옵션을 사용하십니까?
Dru

1
시도 :grep -R "touch" . | cut -d ":" -f 2
carlspring

파일의 내용 만 생성하는 것 같습니다. 당신은 본질적으로 내 질문에 대답했습니다. 나는 내용을 보류하기 위해 파기를 시도 할 수 있습니다.
Dru

아 ... 당신은 파일 이름 만 필요합니까? 실행 : grep -R "touch" . | cut -d ":" -f 1 (죄송합니다.)
carlspring

감사합니다 @carlspring 이것은 흥미 롭습니다. grep내용과 파일 이름이 포함 된 파일 touch이나 내용이 포함 된 파일을 반환 touch하지만 아직 어떤 것인지 잘 모르겠습니다. 반환 된 파일 목록 중 절반 touch은 제목이 touch아닌 본문에 나머지 절반 은 제목에 포함됩니다. 이것을 깨달았습니다.
Dru

5

-maxdepth옵션은 이전에해야 -name다음과 같은 옵션을 선택합니다.,

find . -maxdepth 1 -name "string" -print

1
"문자열"앞뒤에 *를 넣어야합니다.
Aerin

3
find $HOME -name "hello.c" -print

"hello.c"라는 파일이 있는지 전체 $HOME(예 /home/username/:) 시스템을 검색하고 해당 경로 이름을 표시합니다.

/Users/user/Downloads/hello.c
/Users/user/hello.c

그러나 일치하지 않습니다 HELLO.CHellO.C. 대소 문자를 구분하지 않으려면 -iname다음과 같이 옵션을 전달하십시오 .

find $HOME -iname "hello.c" -print

샘플 출력 :

/Users/user/Downloads/hello.c
/Users/user/Downloads/Y/Hello.C
/Users/user/Downloads/Z/HELLO.c
/Users/user/hello.c

-type f파일 만 검색 하려면 옵션을 전달하십시오.

find /dir/to/search -type f -iname "fooBar.conf.sample" -print
find $HOME -type f -iname "fooBar.conf.sample" -print

-iname버전의 find 명령 (OS X 포함) GNU 또는 BSD에 중 하나를 사용할 수 있습니다. find 명령 버전이을 지원하지 않으면 command를 -iname사용하여 다음 구문을 시도하십시오 grep.

find $HOME | grep -i "hello.c"
find $HOME -name "*" -print | grep -i "hello.c"

또는 시도

find $HOME -name '[hH][eE][lL][lL][oO].[cC]' -print

샘플 출력 :

/Users/user/Downloads/Z/HELLO.C
/Users/user/Downloads/Z/HEllO.c
/Users/user/Downloads/hello.c
/Users/user/hello.c

0

문자열이 이름의 시작 부분에 있으면 이렇게 할 수 있습니다

$ compgen -f .bash
.bashrc
.bash_profile
.bash_prompt

3
compgen이 손톱에 적합한 망치가 아닙니다. 이 작은 도구는 사용 가능한 명령 을 나열하도록 설계되었으므로 현재 디렉토리 (스크립트 일 수 있음)의 파일을 나열 하며 파일 이름의 시작 부분을지나거나 파일 내용을 검색하여 파일 내용을 검색 할 수 없습니다. 대부분 쓸모가 없습니다.
msanford

0

이미 제공된 많은 솔루션의 대안은 glob를 이용하는 것입니다 **. 당신이 사용하는 경우 bash옵션과 함께 globstar( shopt -s globstar) 또는를 사용합니다 zsh, 당신은 단지 글로브 사용할 수 있습니다 **이것에 대한합니다.

**/bar

재귀 디렉토리에서 이름이 지정된 파일을 검색합니다 bar( bar현재 디렉토리 의 파일 을 포함 할 가능성이 있음 ). 이것은 동일한 경로 세그먼트 내에서 다른 형태의 글 로빙과 결합 될 수 없습니다. 이 경우* 작업자는 일반적인 효과로 되돌아갑니다.

여기 zshbash여기 에는 미묘한 차이가 있습니다. bash디렉토리에 대한 소프트 링크를 통과 하지만 zsh그렇지 않습니다. 이를 위해 당신은 글로브를 사용해야합니다***/ 에서을 zsh.


0
find / -exec grep -lR "{test-string}" {} \;

1
이 답변은 품질이 낮은 것으로 표시되었습니다. 제안 된 변경 사항이 무엇인지 설명하십시오.
Miroslav Glamuzina

-2
grep -R "somestring" | cut -d ":" -f 1

2
이것은 다른 질문에 대한 답변 인 것 같습니다. 그러나 설명을 제공하지 않았기 때문에 질문하는 사람이나 다른 사람에게는 분명하지 않습니다.
Toby Speight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.