명령 행에서 파일 시스템에서 파일을 찾는 방법은 무엇입니까?


10

파일 시스템에서 파일 (부분적으로 알려진 파일 이름 포함)이있는 위치를 찾고 싶습니다. GUI 유틸리티를 사용하는 대신 명령 줄 에서이 작업을 수행하는 방법을 알고 싶습니다.

Windows에서는 다음을 실행합니다.

cd /d C:\
dir *filename* /s

리눅스와 동등한 것은 무엇입니까?


글쎄요, 고양이 를 벗기는 방법은 여러 가지가 있습니다 . 나는 그것을 할 수있는 방법이 있는지 아직도 궁금합니다 ls.
Iszi

답변:


13
locate filename
find -name '*filename*'
echo **/*filename*
ls -ld **/*filename*

(주요 조건을 읽으십시오. 자세한 내용은 설명서를 읽으십시오.)

디렉토리의 내용을 나열하는 것은 일종의 보조 기능입니다 ls. 의 ls복잡성을 가장 많이 차지하는 주요 작업은 디스플레이를 미세 조정하는 것입니다. 수동에서 (봐 및 옵션의 수 대 표시 할 파일 선택에 관련된 옵션의 수를 비교 각 파일 및 방법 디스플레이 포맷에 대한 디스플레이 제어 정보가 무엇인지 그. 이것은 모두 사실이다 GNU의 LS 하는 당신에게 ' 초기 부터 Linux 및 기타 옵션이 적은 다른 시스템 에서 찾을 수 있습니다 .)

기본 모드는 ls디렉토리를 전달할 때 해당 디렉토리의 파일을 나열하는 것입니다. 다른 유형의 파일 (일반 파일, 심볼릭 링크 등)을 전달하면 해당 파일 만 나열됩니다. (이는 각 인수에 개별적으로 적용됩니다.)이 옵션 -dls디렉토리로 절대 하강하지 않도록 지시 합니다.

ls-R디렉토리를 재귀 적으로 나열하도록 지시 하는 옵션이 있습니다 . 그러나 적용 가능성이 제한적이며 출력에서 ​​많은 필터링을 허용하지 않습니다.

패턴 일치를 수행하는 첫 번째 도구는 쉘 자체입니다. 다른 명령은 필요하지 않습니다. 와일드 카드를 입력하기 만하면됩니다. 이것을 globbing이라고 합니다.

echo *filename*

일반적으로 와일드 카드는 현재 디렉토리 (또는 표시된 디렉토리 :)로 제한되었습니다 echo /some/where/*filename*. A *는 모든 파일 이름 또는 파일 이름의 일부 *.txt와 일치 하지만 일치하지 않습니다 foo/bar.txt. 현대 쉘은 **/"이 디렉토리 또는 그 아래의 디렉토리 (재귀 적으로)"를 의미 하는 패턴 을 추가했습니다 . bash를 사용하면 기록 호환성을 위해이 기능을 명시 적으로 활성화해야합니다 shopt -s globstar(이 행을에 추가 할 수 있음 ~/.bashrc).

echo **/*filename*

echo명령은 셸에서 생성 된 파일 이름 목록 만 표시합니다. 예외적으로 일치하는 파일 이름이 없으면 와일드 카드 패턴은 bash에서 변경되지 않은 상태로 유지되며 (설정하지 않은 shopt -s nullglob경우 패턴이 빈 목록으로 확장되는 경우) zsh는 오류를 표시합니다 (설정하지 않은 경우 setopt nullglob또는 setopt no_no_match패턴이 변경되지 않은 채 남아 있습니다).

ls옵션에 여전히 사용할 수 있습니다. 예를 들어 ls색상을 통해 파일 (디렉토리, 실행 파일 등)의 특성 또는 권한에 대한 표시를 제공 할 수 있습니다. 로 파일의 날짜, 크기 및 소유권을 표시 할 수 있습니다 ls -l. 더 많은 옵션에 대해서는 설명서를 참조하십시오.

디렉토리 트리에서 파일을 찾는 일반적인 명령은 find입니다. 표시 할 파일 및 처리 할 작업을 제어하는 ​​많은 옵션이 제공됩니다. 예를 들어, 이름 *filename*이 현재 디렉토리 및 서브 디렉토리 의 패턴과 일치하는 파일을 찾아서 이름 을 인쇄하려면 다음을 수행하십시오.

find /some/dir -name '*filename*' -print

-print조치 (대부분의 다른 조치는 파일에서 명령을 실행하는 것으로 구성됨)입니다. 조치를 취하지 않으면 -print내포됩니다. 또한 트래버스 할 디렉토리를 지정하지 않으면 ( /some/dir위) 현재 디렉토리가 암시됩니다. 조건 -name '*filename'은 이름이 해당 패턴과 일치하는 파일 만 나열 (또는 작동)합니다. -mtime -1지난 24 시간 동안 수정 된 파일과 일치시키기위한 다른 많은 필터 가 있습니다. -name '*filename*'와일드 카드가 현재 디렉토리의 파일과 일치하지 않는 경우에만 따옴표를 생략 할 수 있습니다 (위 참조). 대체로 짧은 형식은

find -name '*filename*'

파일 이름을 알고있을 때 유용한 도구 중 하나는 locate입니다. 이 도구는 파일 이름의 데이터베이스를 쿼리합니다. 일반적인 시스템에서는 매일 밤마다 새로 고쳐집니다. locate오버 의 장점은 find /훨씬 빠릅니다. 단점은 정보가 오래되었다는 것입니다. locate다중 사용자 시스템에서 작동 방식이 다른 몇 가지 구현이 있습니다. 기본 locate프로그램은 공개적으로 읽을 수있는 파일 만 색인화합니다 ( updatedb계정의 모든 파일을 색인화하는 두 번째 데이터베이스를 작성하기 위해 동반자 를 실행할 수 있음). 모든 파일을 인덱싱하고 locate프로그램이 사용자가 볼 수있는 파일 만 반환하도록 데이터베이스를 필터링하도록 하는 다른 버전 (이동, 분할)이 있습니다.

locate filename

때로는 배포판의 패키지가 파일을 제공한다고 생각하고 파일의 이름은 알고 있지만 패키지 이름은 알고 있지 않으며 패키지를 설치하려고합니다. 많은 배포판이이를위한 도구를 제공합니다. 우분투에서는 apt-file search filename입니다. 다른 시스템에서 동등한 명령을 사용하려면 Pacman Rosetta를 확인하십시오 .


이것을 다시 투표 할 수 있기를 바랍니다. 오늘 밤 다른 프로젝트를 찾아야했습니다. 다시 감사합니다, @Gilles!
Iszi

6

DOS 예제와 동등한 내용은 다음과 같습니다.

cd /
find . -name \*filename\* -print

리눅스에서는 일반적으로 -print더 이상 논쟁이 필요하지 않습니다 . 다른 운영 체제에서 작업하고 있다면 알아두면 편리합니다.


5

"빠른" 무언가를 원 하지만 미션 크리티컬 한 상황이 아니라면 그것이 존재하고 어디에 있는지 알고 싶을 때 사용할 수 있습니다 locate. 정보를 수집하도록 지시 한 디렉토리에 모든 파일의 데이터베이스를 유지합니다.

기본 설치 (Ubuntu에서) 에서 파일 시스템을 스캔하고 데이터베이스를 업데이트 locate하는 매일 cron작업을 설정 합니다 ...

당신은 당신이 다음 크론를 업데이트하기 전에 최신 데이터베이스를 가져올 필요가 느끼는 경우보다 일반적으로 빠른 find또는 ls바로 실행 sudo updatedb다음과 locate. 더 많은 검색을해야 할 경우는 그 이름에서 알 수 있듯이, ... 빠른 확실히 updatedb하는 데이터베이스 업데이트 locate사용을 ...

locate내장 정규 표현식이있어 매우 편리합니다 ... find스크립트에서 사용하지만 find명령 줄 에서는 거의 사용하지 않습니다 . 나는 심지어 locate(개인) 스크립트에서 사용 합니다.locate -bir "oo.*datt.*mp4$"

locate 일치하는 파일의 정규화 된 경로를 반환합니다.


2
find [path] -name [filename]

예를 들어, foo가 포함 된 파일 이름을 / home 디렉토리에서 검색하려면 다음 명령을 사용합니다.

find /home -name *foo*

man findfind 명령 및 인수에 대한 자세한 정보 는 명령 을 사용하십시오 .


3
*쉘이 해석하지 못하도록하려면 s 를 인용하거나 이스케이프해야 합니다.
숀 J. 고프

배포판 / 쉘이 구체적입니까? 탈출하지 않고 Fedora 16에서 실행했으며 정상적으로 작동했습니다.
josh-cain

1
별표와 일치하지 않는 별을 프로그램에 전달하는 일부 셸에는 옵션이 있습니다. 현재 디렉토리에서 해당 패턴과 일치하는 파일을 작성하고 명령을 다시 시도하십시오.
숀 J. 고프
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.