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

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

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

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

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

Linux와 동등한 것은 무엇입니까?

답변1

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

(주요 이용약관을 계속 읽어보시기 바랍니다. 브로셔에 있는 작은 글씨도 읽어보시기 바랍니다.)

디렉토리의 내용을 나열하는 것은 ls.의 주요 작업 ls(복잡성의 대부분을 차지하는 작업)의 디스플레이를 미세 조정하는 것입니다. (매뉴얼을 확인하고 표시할 파일 선택과 관련된 옵션 수와 각 파일에 표시되는 정보 및 표시 형식을 제어하는 ​​옵션 수를 비교하십시오. 둘 다 정확합니다.GNU 언어Linux에서 찾을 수 있으며,다른시스템에는 옵션이 더 적습니다.일찍하늘. )

기본 모드는 ls디렉터리를 전달하면 해당 디렉터리의 파일이 나열되는 것입니다. 다른 유형의 파일(일반 파일, 심볼릭 링크 등)을 전달하면 해당 파일만 나열됩니다. (이는 각 매개변수에 별도로 적용됩니다.) 이 옵션은 디렉터리를 입력하지 않도록 -d지시합니다 .ls

ls-R실제로 디렉토리를 재귀적으로 나열하도록 지시하는 옵션이 있습니다 . 그러나 적용 가능성이 제한되어 있으며 출력을 많이 필터링할 수 없습니다.

패턴 일치를 수행하는 첫 번째 도구는 셸 자체입니다. 다른 명령은 필요하지 않습니다. 와일드카드만 입력하면 설정이 완료됩니다. 이것은 ... 불리운다와일드카드.

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색상을 사용하여 파일(디렉토리, 실행 파일 등)의 성격이나 권한을 나타낼 수 있습니다. .txt를 사용하여 파일의 날짜, 크기 및 소유권을 표시할 수 있습니다 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파일 이름 데이터베이스를 쿼리하는 것입니다. 일반적인 시스템에서는 매일 밤 새로 고쳐집니다. locateover의 장점 find /은 훨씬 빠르다는 것입니다. 단점은 해당 정보가 오래되었을 수 있다는 것입니다. 여러 가지 구현이 있으며 locate다중 사용자 시스템에서는 다르게 작동합니다. 기본 프로그램은 공개적으로 읽을 수 있는 파일만 색인화합니다( 계정의 모든 파일을 색인화하려면 locate보조 프로그램을 실행해야 할 수도 있습니다 ). updatedb모든 파일을 색인화하고 프로그램이 locate데이터베이스를 필터링하여 볼 수 있는 파일만 반환하도록 하는 버전(mlocate, slocate).

locate filename

때로는 배포판의 패키지에서 파일이 제공된다고 생각하고 파일 이름(일부)을 알고 있지만 패키지 이름은 모르며 해당 패키지를 설치하려고 할 때가 있습니다. 많은 배포판에서는 이를 위한 도구를 제공합니다. Ubuntu에서는 다른 시스템에 해당하는 명령이 있는지 apt-file search filename확인하십시오.팩맨 로제타.

답변2

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

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

그러나 Linux에서는 일반적으로 이 -print매개변수가 더 이상 필요하지 않습니다. 다른 운영 체제에서 작업하고 있는지 알아두면 도움이 될 것입니다.

답변3

당신이 뭔가를 원한다면"빠르게", 그러나 그것이 존재하는지, 어디에 있는지 알고 싶은 중요한 상황에서는 사용할 수 없습니다 locate. 정보를 수집하도록 지정한 디렉토리에 모든 파일의 데이터베이스를 유지합니다.

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

다음 cron 업데이트 전에 데이터베이스를 업데이트해야 한다고 생각되면 일반적 find으로 직접 실행하는 것보다 빠릅니다. 더 많은 검색을 수행해야 한다면 확실히 더 빨라질 것입니다... 이름에서 알 수 있듯이 사용된 데이터베이스를 업데이트하십시오...lssudo updatedblocateupdatedblocate

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

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

답변4

find [path] -name [filename]

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

find /home -name *foo*

man findfind 명령 및 매개변수에 대한 자세한 정보를 얻으려면 이 명령을 사용하십시오 .

관련 정보