디렉토리에서 이름 "ABC"로 시작하는 모든 파일을 검색하는 방법은 무엇입니까?


58

특정 이름으로 시작하는 파일을 검색해야합니다. 특정 패턴으로 시작하는 여러 파일이있을 수 있으며 디렉토리에있는 모든 파일을 나열하고 싶습니다.

답변:


60

기존 답변을 완료하려면

ls

기본 디렉토리 목록 유틸리티 ls는 쉘의 와일드 카드와 함께 사용할 수 있습니다. 패턴이있는 모든 파일을 검색하려면 다음을 수행하십시오 abc.

ls abc*   # list all files starting with abc---
ls *abc*  # list all files containing --abc--
ls *abc   # list all files ending with --abc

파일 확장자는 검색 결과와도 관련이 있습니다.


tree

디렉토리 트리에 파일을 나열해야하는 경우 tree다음 과 같은 주어진 패턴 을 검색하도록 발행 할 수도 있습니다 .

tree -P 'abc*'  # list directory tree of file starting with abc---
tree -l 'def*'  # exclude files starting with def---

이 경우 tree자체는 와일드 카드를 지원합니다.


2
왜 내가 일치하는 디렉토리 이름 대신 모든 디렉토리 ls -l B*내용 을 표시 B합니까?
ErikE

@ErikE ls디렉토리를 나열 하도록 요청 하면 디렉토리가 열리기 때문에 디렉토리를 여는 것과 같습니다 ls -l BirthdayPhotos. 를 사용하여 해당 동작을 억제 할 수 있습니다 ls -d B*.
Azor Ahai

@AzorAhai 그러나 왜 B*디렉토리 사양으로 취급 됩니까?
ErikE

@ErikE 파일 glob를 사용하면 B*시작하는 모든 디렉토리와 일치하도록 확장 B되므로 실제로 ls디렉토리 목록을 전달하므로 모든 디렉토리가 열립니다.
Azor Ahai

1
질문에 대답하지 않습니다. ls -d ABC*저자가 요구 한 내용이었습니다. 또한 코드 스 니펫의 주석이 잘못되어 abc로 시작하는 디렉토리의 내용ls abc*나열 됩니다 .
greatvovan

42

find패턴을 사용 하여 파일을 검색 하는 명령을 사용할 수 있습니다

find . -type f -name "abc*" 

위의 명령은 현재 작업 디렉토리에서 abc로 시작하는 파일을 검색합니다.

-name 'abc'정확히 일치하는 파일을 나열합니다. 예 : abc

당신은 또한 사용할 수 있습니다

 -iname
 -regex 

find패턴을 사용하여 파일 이름을 검색 하는 명령이있는 옵션


7

당신이 그들과 함께하고 싶은 일에 따라 여러 가지 방법이 있습니다. 일반적으로 목록을 표시하려면 다음을 사용하여 터미널에서 할 수 있습니다.

find | grep '^\./ABC'

... 그리고 ABC당신의 텍스트로 대체 .

명령을 이해하려면 조금 세분화하십시오.

  • find현재 디렉토리 및 해당 서브 디렉토리 아래의 모든 파일을 나열합니다. 그것을 혼자 사용하면 거기에 모든 것이 나열됩니다. 로 find시작하는 각 파일 또는 디렉토리 를 출력하여 ./해당 경로가 현재 디렉토리에 상대적임을 나타냅니다. 이 사실을 아는 것은 우리가 ./ABC아니라 시작하는 결과를 검색한다는 것을 의미하기 때문에 중요합니다 ABC.

  • 파이프 문자 |는 한 명령의 출력을 다른 명령으로 리디렉션하며,이 경우의 출력은 find로 리디렉션됩니다 grep. 이것을 파이핑이라고합니다.

  • grep출력을 받아서 주어진 패턴을 사용하여 필터링합니다 ^\./ABC.

    • ' '쉘이 특수 문자를 해석하지 못하도록 패턴은 작은 따옴표 로 인용됩니다 .
  • 이제 패턴 자체는 regular expression 또는 regex 라고하는 특정 구문으로 작성되었습니다 . 정규식은 당신이 그것을 마스터하면 매우 강력한 검색 도구이며, 같은 사이트가 더 깊이에 대해 가르치는는하지만주의 grep본격적인 정규식 엔진을하지 않고 당신이 그것으로 모든 것을 할 수 있습니다.

  • 우리의 목적을 위해 :

    • ^정규식에서 문자열의 시작과 일치합니다. 파일 이름의 시작 부분에 패턴이 나타나지 않으면 패턴과 일치하지 않습니다.

    • .정규 표현식에서 특별한 의미가 있습니다. "여기에 모든 단일 문자 일치"를 의미합니다. 리터럴 점으로 사용하려면 백 슬래시 \를 사용하여 점을 이스케이프 처리 해야합니다. (그렇습니다. 어떤 캐릭터와도 일치하는 것은 우리의 경우 무해하지만, 나는 완전성을 위해 그것을했습니다.)


1
왜 것이 당신 자신의 완벽하게 좋은 패턴 매칭 기능이? find | grepfind
Darael

3

GREP을 사용할 수 있습니다. 이것이 가장 간단한 해결책이라고 생각합니다. 아마도 다른 grep 매개 변수를 추가하여 일치를보다 정확하게 만듭니다.

tree | grep ABC

2

노틸러스 파일 관리자 및 정규식을 사용하여 특정 패턴을 검색 할 수 있습니다.

이렇게하려면 아래처럼 기어 메뉴에서 일치 하는 항목 선택을 클릭하십시오 ( Ctrl+ 를 누를 수도 있습니다 s).

여기에 이미지 설명을 입력하십시오

그런 다음 정규 표현식을 입력 ABC*하고 확인하십시오.

여기에 이미지 설명을 입력하십시오

패턴과 이름이 같은 모든 파일이 자동으로 선택됩니다.

여기에 이미지 설명을 입력하십시오

Ubuntu 12.10 (Quantal)의 GNOME3 PPA 에서 Nautilus 3.6. *를 사용하고 있습니다.


1

나에게 가장 쉬운 해결책

ls | grep PATTERN

PATTERN에서 정규 표현식을 제공 할 수 있습니다.

예를 들어, 이름 내에 "ab"가있는 파일을 찾으려면 다음을 입력하십시오.

ls | grep ".*ab.*"

"ab"로 시작하는 파일을 찾으려면 다음을 입력하십시오.

ls | grep "^ab"

1

ABC*파일이 있는 디렉토리 를 모르고 수백만 개의 파일 locate이있는 경우 명령이 가장 빠른 방법입니다.

$ locate /ABC
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABC6AD2FEC16465049B48D39FD2FE538258F2A34
/mnt/clone/home/rick/.cache/mozilla/firefox/9fu0cuql.default/cache2/entries/ABCBFDA54262F47253F95ED6ED4131A465EE0E39
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/mnt/clone/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh
/mnt/old/home/rick/.cache/mozilla/firefox/3vkvi6ov.default/cache2/entries/ABC0C99FCEABAD0C6AA2078CD025A1CDE48D7BA1
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCABC.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBCDA.sh
/usr/src/linux-headers-5.0.1-050001/tools/lib/lockdep/tests/ABCDBDDA.sh

노트:

  • 위 명령은 1 백만 개의 파일에서 실행하는 데 1 초가 걸립니다.
  • 이에 비해 루트 디렉토리 find에서 시작 하는 명령 /시간이 오래 걸리고 많은 권한 오류가 발생합니다.
  • 오늘 파일이 작성된 경우 먼저 실행해야합니다 sudo updatedb.

0

나는 사용한다

ls | grep abc

또는

ls -la | grep abc

abc로 시작하는 것이 아니라 abc로 모든 파일을 표시합니다. 그러나이 작업을 수행하는 것은 정말 쉬운 방법입니다.


0

파이썬 :

$ python -c 'import sys,os;found=[os.path.join(r,i) for r,s,f in os.walk(".") for i in f if i.startswith("ABC")];map(lambda x: sys.stdout.write(x+"\n") ,found)'

펄 :

$ perl -le 'use File::Find;find(sub{ -f && $_ =~/^ABC/ && print $File::Find::name  },".")' 

0
printf "%s" /path/to/files/ABC*

이것은 양쪽 끝에 고정 된 글로브 패턴 일치입니다. "ABC", "ABC.txt", "ABC123"과 같은 "ABC"로 시작하는 모든 파일과 일치하지만 "xABC"는 일치하지 않습니다. 'printf'대신에 'ls'를 사용하는 명령 행에서 여기에 안전한 대안이 있지만, 누가 동의하는지에 따라 'ls'는 스크립트에서 사용하기에 안전하지 않습니다. 이 경우 glob 패턴 일치와 함께 'printf'를 사용하는 것이 안전합니다. 스크립트에서 이것을 사용하려는 경우 'printf'출력에는 다음과 같이 출력 스트림이 끝날 때까지 줄 바꿈 문자가 포함되지 않습니다.

printf "%s" /path/to/files/ABC*  

보고:

/path/to/files/ABC /path/to/files/ABC123

각 인스턴스 후에 줄 바꿈이 필요한 경우 :

printf "%s\n" /path/to/files/ABC*

보고:

/path/to/files/ABC 

/path/to/files/ABC123

'printf'명령을 실행할 때 "/ path / to / files /"를 입력하면 출력에 남아 있습니다. 그것이 없으면 파일 이름 만 나타납니다.

printf "%s" ABC* 

보고

ABC ABC123

파일이 존재하는 디렉토리 내에서 명령을 실행한다고 가정하십시오.


echo /path/to/files/ABC* | tr " " "\n"좋은 생각이 아니다. 파일 /path/to/files/ABC EFG이 있으면 파일 이름에 공백이 있습니다. 귀하가 tr좋지 않은 두 개의 선으로 파일 이름을 깰 것입니다. 파일 이름에 공백이 여러 개 있으면 더 나쁩니다. 난 당신이 사용하는 것이 좋습니다 것 printf "%s\n" ABC*파일 이름에 공백이 도움이되는 대신,하지만 여전히 같은 다른 특수 문자 문제가\n
세르지 Kolodyazhnyy

0

내가 좋아하는 vim 플러그인 중 하나 인 Command-tFZF와의 통합 위의 루비 기반 플러그인 입니다.

Comamnd-T 및 FZF를 사용하면 다음과 같은 매우 빠른 "퍼지"메커니즘으로 검색 할 수 있습니다.

  • 파일과 버퍼 열기
  • 태그와 도움말로 이동
  • 명령 실행 또는 이전 검색 및 명령
  • 최소한의 키 입력으로

보시다시피

여기에 이미지 설명을 입력하십시오

나는 항상 새로운 터미널을 열어 명령 기록을 검색하고 다음을 누르십시오.

CTRL+R

터미널 탭에 쓰면 모든 폴더를 재귀 적으로 검색 할 수 있습니다.

fzf

그런 다음 파일 이름을 시작하십시오

ABC

또한 안에 쓸 수 있습니다 vim

:CommandT 

큰 폴더에서 특히 유용합니다.


0

루트 디렉토리에 있고 etc 디렉토리의 목록 만 원한다고 가정합니다.

find -type d -name "etc"

우리가 얻는 결과

[root@unix /]# find -type d -name "etc"

./etc
./usr/lib/firefox/bundled/etc
./usr/lib/unix-yarn/etc
./usr/lib/unix/etc
./usr/lib/festival/etc
./usr/bin/lib/vmware-tools/lib64/libconf/etc
./usr/bin/lib/vmware-tools/lib32/libconf/etc
./usr/etc
./usr/share/doc/oddjob-0.30/sample/etc
./usr/share/festival/lib/etc
./usr/local/etc
./usr/java/jdk1.7.0_25/lib/visualvm/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib64/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/lib/lib32/libconf/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/etc
./home/user1/Desktop/VMware Tools/vmware-tools-distrib/caf/etc

또 다른 예,

또한 다음과 같이 쓸 수 있습니다 :

ls | grep "etc"

우리는 얻는다

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