웹사이트 검색

찾기 및 찾기를 사용하여 Linux에서 파일을 검색하는 방법


소개

Linux로 작업하는 방법을 처음 배울 때 사용자가 직면하는 한 가지 문제는 찾고 있는 파일을 찾는 방법입니다.

이 가이드에서는 적절한 이름의 find 명령을 사용하는 방법을 설명합니다. 이렇게 하면 다양한 필터와 매개변수를 사용하여 시스템에서 파일을 검색하는 데 도움이 됩니다. 또한 다른 방식으로 파일을 검색하는 데 사용할 수 있는 locate 명령에 대해서도 간략하게 다룹니다.

전제 조건

이 가이드를 따라 하려면 Linux 기반 운영 체제를 실행하는 컴퓨터에 액세스해야 합니다. 이것은 SSH 또는 로컬 시스템으로 연결한 가상 사설 서버일 수 있습니다. 이 튜토리얼은 Ubuntu 20.04를 실행하는 Linux 서버를 사용하여 검증되었지만 주어진 예제는 모든 Linux 배포 버전을 실행하는 컴퓨터에서 작동해야 합니다.

이 가이드를 따르기 위해 원격 서버를 사용할 계획이라면 먼저 초기 서버 설정 가이드를 완료하는 것이 좋습니다. 이렇게 하면 sudo 권한이 있는 루트가 아닌 사용자와 UFW로 구성된 방화벽을 포함하여 보안 서버 환경을 설정하여 Linux 기술을 구축하는 데 사용할 수 있습니다.

참고: findlocate 명령의 작동 방식을 설명하기 위해 이 가이드의 예제 명령은 / 또는 루트 디렉토리. 이로 인해 루트가 아닌 사용자로 터미널에 로그인한 경우 일부 예제 명령의 출력에 권한 거부됨이 포함될 수 있습니다.

일반 사용자가 일반적으로 액세스할 수 없는 디렉토리 내에서 파일을 검색하기 때문에 이는 예상할 수 있습니다. 그러나 이러한 예제 명령은 여전히 작동하며 이러한 프로그램의 작동 방식을 이해하는 데 유용합니다.

이름으로 찾기

파일을 검색하는 가장 확실한 방법은 이름으로 검색하는 것입니다.

find 명령을 사용하여 이름으로 파일을 찾으려면 다음 구문을 사용합니다.

  1. find -name "query"

대소문자를 구분하므로 query 검색은 Query 검색과 다릅니다.

이름으로 파일을 찾으되 쿼리의 대소문자를 무시하려면 -iname 옵션을 사용하십시오.

  1. find -iname "query"

특정 패턴을 따르지 않는 모든 파일을 찾으려면 -not을 사용하여 검색을 뒤집을 수 있습니다.

  1. find -not -name "query_to_avoid"

또는 다음과 같이 느낌표(!)를 사용하여 검색을 반전할 수 있습니다.

  1. find \! -name "query_to_avoid"

!를 사용하는 경우 백슬래시(\\)로 문자를 이스케이프해야 셸이 찾기 전에 해석을 시도하지 않습니다. 행동할 수 있습니다.

유형별 찾기

-type 매개변수로 찾으려는 파일 유형을 지정할 수 있습니다. 다음과 같이 작동합니다.

  1. find -type type_descriptor query

다음은 파일 유형을 지정하는 데 사용할 수 있는 설명자 중 일부입니다.

  • f: 일반 파일
  • d: 디렉토리
  • l: 심볼릭 링크
  • c: 문자 장치
  • b: 블록 장치

예를 들어 시스템에서 모든 문자 장치를 찾으려면 다음 명령을 실행할 수 있습니다.

  1. find /dev -type c

이 명령은 특히 Linux 시스템에서 장치 파일이 일반적으로 마운트되는 디렉터리인 /dev 디렉터리 내의 장치만 검색합니다.

Output
/dev/vcsa5 /dev/vcsu5 /dev/vcs5 /dev/vcsa4 /dev/vcsu4 /dev/vcs4 /dev/vcsa3 /dev/vcsu3 /dev/vcs3 /dev/vcsa2 /dev/vcsu2 /dev/vcs2 . . .

다음과 같은 명령을 사용하여 .conf로 끝나는 모든 파일을 검색할 수 있습니다. 이 예제는 /usr 디렉토리 내에서 일치하는 파일을 검색합니다.

  1. find /usr -type f -name "*.conf"
Output
/usr/src/linux-headers-5.4.0-88-generic/include/config/auto.conf /usr/src/linux-headers-5.4.0-88-generic/include/config/tristate.conf /usr/src/linux-headers-5.4.0-90-generic/include/config/auto.conf /usr/src/linux-headers-5.4.0-90-generic/include/config/tristate.conf /usr/share/adduser/adduser.conf /usr/share/ufw/ufw.conf /usr/share/popularity-contest/default.conf /usr/share/byobu/keybindings/tmux-screen-keys.conf /usr/share/libc-bin/nsswitch.conf /usr/share/rsyslog/50-default.conf . . .

참고: 이전 예제는 두 개의 find 쿼리 식을 결합합니다. 즉, -type f-name *.conf입니다. 파일이 반환되려면 이 두 식을 모두 충족해야 합니다.

-and 옵션으로 구분하여 이와 같은 식을 결합할 수 있지만 이 예에서 알 수 있듯이 -and는 두 식을 포함할 때마다 암시됩니다. -or 옵션으로 구분하여 식 중 하나를 만족하는 결과를 반환할 수도 있습니다.

  1. find -name query_1 -or -name query_2

이 예제는 이름이 query_1 또는 query_2와 일치하는 모든 파일을 찾습니다.

시간 및 크기별 필터링

find는 결과를 크기와 시간별로 필터링하는 다양한 방법을 제공합니다.

크기

-size 매개변수를 사용하여 크기별로 파일을 필터링할 수 있습니다. 이렇게 하려면 크기를 바이트, 메가바이트, 기가바이트 또는 다른 크기로 계산하는지 여부를 나타내기 위해 숫자 크기 값 끝에 특수 접미사를 추가해야 합니다. 다음은 일반적으로 사용되는 크기 접미사입니다.

  • c: 바이트
  • k: 킬로바이트
  • M: 메가바이트
  • G: 기가바이트
  • b: 512바이트 블록

예를 들어, 다음 명령은 /usr 디렉토리에서 정확히 50바이트인 모든 파일을 찾습니다.

  1. find /usr -size 50c

50바이트 미만인 파일을 찾으려면 다음 구문을 대신 사용할 수 있습니다.

  1. find /usr -size -50c

/usr 디렉토리에서 700MB가 넘는 파일을 찾으려면 다음 명령을 사용할 수 있습니다.

  1. find /usr -size +700M

시간

시스템의 모든 파일에 대해 Linux는 액세스 시간, 수정 시간 및 변경 시간에 대한 시간 데이터를 저장합니다.

  • 액세스 시간: 마지막으로 파일을 읽거나 쓴 시간입니다.
  • 수정 시간: 파일 내용이 마지막으로 수정된 시간입니다.
  • 변경 시간: 파일의 inode 메타데이터가 마지막으로 변경된 시간입니다.

-atime, -mtime-ctime 옵션을 사용하여 이러한 매개변수를 기반으로 find 검색을 수행할 수 있습니다. 각기. 이러한 옵션에 대해 검색하려는 과거 일 수를 나타내는 값을 전달해야 합니다. 앞에서 설명한 크기 옵션과 유사하게 이 옵션 앞에 더하기 또는 빼기 기호를 추가하여 "보다 큼\ 또는 "미만\을 지정할 수 있습니다.

예를 들어 /usr 디렉토리에서 마지막 날에 수정된 파일을 찾으려면 다음 명령을 실행하십시오.

  1. find /usr -mtime 1

하루 전에 액세스한 파일을 원하는 경우 다음 명령을 실행할 수 있습니다.

  1. find /usr -atime -1

3일 이상 전에 마지막으로 메타 정보가 변경된 파일을 찾으려면 다음을 실행할 수 있습니다.

  1. find /usr -ctime +3

이러한 옵션에는 일 대신 분을 지정하는 데 사용할 수 있는 동반 매개변수도 있습니다.

  1. find /usr -mmin -1

이것은 마지막 순간에 수정된 파일을 제공합니다.

find는 또한 참조 파일과 비교하여 최신 파일을 반환할 수 있습니다.

  1. find / -newer reference_file

이 구문은 참조 파일보다 최근에 생성되거나 변경된 시스템의 모든 파일을 반환합니다.

소유자 및 권한으로 찾기

-user-group 매개변수를 각각 사용하여 파일을 소유한 사용자 또는 그룹별로 파일을 검색할 수도 있습니다. syslog 사용자가 소유한 /var 디렉토리에서 모든 파일을 찾으려면 다음 명령을 실행하십시오.

  1. find /var -user syslog

마찬가지로 다음을 입력하여 섀도우 그룹이 소유한 /etc 디렉토리의 파일을 지정할 수 있습니다.

  1. find /etc -group shadow

특정 권한이 있는 파일을 검색할 수도 있습니다.

정확한 권한 세트를 일치시키려면 8진수 표기법을 사용하여 권한을 지정하는 다음 구문을 사용할 수 있습니다.

  1. find / -perm 644

이렇게 하면 지정된 권한과 정확히 일치하는 파일을 찾습니다.

최소한 해당 권한이 있는 항목을 지정하려면 권한 표기 앞에 빼기 기호를 붙일 수 있습니다.

  1. find / -perm -644

이는 추가 권한이 있는 모든 파일과 일치합니다. 744 권한이 있는 파일은 이 인스턴스에서 일치합니다.

깊이로 필터링

이 섹션에서는 구조 내 깊이별로 파일 필터링을 탐색하는 데 사용할 예제 디렉토리 구조를 생성합니다.

이 튜토리얼의 예제를 따라하는 경우 /tmp/ 디렉토리 내에 이러한 파일과 디렉토리를 만드는 것이 좋습니다. /tmp/임시 디렉토리입니다. 즉, 다음에 서버가 부팅될 때 그 안의 모든 파일과 디렉토리가 삭제됩니다. 이것은 나중에 시스템을 방해할 염려 없이 원하는 만큼 많은 디렉터리, 파일 및 링크를 만들 수 있으므로 이 가이드의 목적에 유용할 것입니다.

이 섹션의 명령을 실행한 후 /tmp/ 디렉토리에는 첫 번째 레벨에 10개의 디렉토리가 있는 세 가지 레벨의 디렉토리가 포함됩니다. 각 디렉토리(임시 디렉토리 포함)에는 10개의 파일과 10개의 하위 디렉토리가 포함됩니다.

다음 명령을 사용하여 /tmp/ 디렉토리 내에 예제 디렉토리 구조를 만듭니다.

  1. mkdir -p /tmp/test/level1dir{1..10}/level2dir{1..10}/level3dir{1..10}

그런 다음 touch 명령을 사용하여 이 디렉토리를 몇 가지 샘플 파일로 채웁니다.

  1. touch /tmp/test/{file{1..10},level1dir{1..10}/{file{1..10},level2dir{1..10}/{file{1..10},level3dir{1..10}/file{1..10}}}}

이러한 파일과 디렉터리가 준비되면 방금 만든 test/ 디렉터리로 이동합니다.

  1. cd /tmp/test

find가 이 구조에서 파일을 검색하는 방법에 대한 기본적인 이해를 얻으려면 이름이 file1인 모든 파일과 일치하는 일반 이름 검색으로 시작합니다.

  1. find -name file1
Output
./level1dir7/level2dir8/level3dir9/file1 ./level1dir7/level2dir8/level3dir3/file1 ./level1dir7/level2dir8/level3dir4/file1 ./level1dir7/level2dir8/level3dir1/file1 ./level1dir7/level2dir8/level3dir8/file1 ./level1dir7/level2dir8/level3dir7/file1 ./level1dir7/level2dir8/level3dir2/file1 ./level1dir7/level2dir8/level3dir6/file1 ./level1dir7/level2dir8/level3dir5/file1 ./level1dir7/level2dir8/file1 . . .

이것은 많은 결과를 반환합니다. 출력을 카운터로 파이프하면 총 결과가 1111임을 알 수 있습니다.

  1. find -name file1 | wc -l
Output
1111

대부분의 상황에서 유용하기에는 결과가 너무 많을 수 있습니다. 범위를 좁히기 위해 최상위 검색 디렉토리에서 검색의 최대 깊이를 지정할 수 있습니다.

  1. find -maxdepth num -name query

level1 디렉토리 이상에서만 file1을 찾으려면 최대 깊이를 2로 지정할 수 있습니다(최상위 디렉토리의 경우 1, level1의 경우 1). 디렉토리):

  1. find -maxdepth 2 -name file1
Output
./level1dir7/file1 ./level1dir1/file1 ./level1dir3/file1 ./level1dir8/file1 ./level1dir6/file1 ./file1 ./level1dir2/file1 ./level1dir9/file1 ./level1dir4/file1 ./level1dir5/file1 ./level1dir10/file1

그것은 훨씬 더 관리하기 쉬운 목록입니다.

모든 파일이 현재 디렉터리 아래의 특정 지점을 지나 존재한다는 것을 알고 있는 경우 최소 디렉터리를 지정할 수도 있습니다.

  1. find -mindepth num -name query

이것을 사용하여 디렉토리 분기의 끝에 있는 파일만 찾을 수 있습니다.

  1. find -mindepth 4 -name file1
Output
./level1dir7/level2dir8/level3dir9/file1 ./level1dir7/level2dir8/level3dir3/file1 ./level1dir7/level2dir8/level3dir4/file1 ./level1dir7/level2dir8/level3dir1/file1 ./level1dir7/level2dir8/level3dir8/file1 ./level1dir7/level2dir8/level3dir7/file1 ./level1dir7/level2dir8/level3dir2/file1 . . .

다시 말하지만 분기 디렉터리 구조로 인해 많은 수의 결과(1000)가 반환됩니다.

최소 및 최대 깊이 매개변수를 결합하여 좁은 범위에 집중할 수 있습니다.

  1. find -mindepth 2 -maxdepth 3 -name file1
Output
./level1dir7/level2dir8/file1 ./level1dir7/level2dir5/file1 ./level1dir7/level2dir7/file1 ./level1dir7/level2dir2/file1 ./level1dir7/level2dir10/file1 ./level1dir7/level2dir6/file1 ./level1dir7/level2dir3/file1 ./level1dir7/level2dir4/file1 ./level1dir7/file1 . . .

이와 같이 이러한 옵션을 결합하면 이전 1000줄 대신 110줄만 반환되어 결과가 상당히 좁아집니다.

찾기 결과에 대한 명령 실행

다음 구문을 사용하여 -exec 매개변수를 사용하여 find와 일치하는 모든 항목에 대해 임의 도우미 명령을 실행할 수 있습니다.

  1. find find_parameters -exec command_and_options {} \;

{}find가 일치하는 파일의 자리 표시자로 사용됩니다. \;find에게 명령이 끝나는 위치를 알려줍니다.

예를 들어, 이전 단계에서 /tmp/ 디렉토리 내에 생성한 test/ 디렉토리에 여전히 있다고 가정하면 이전 섹션에서 다음과 같은 파일을 찾을 수 있습니다. 644 권한이 있고 664 권한을 갖도록 수정합니다.

  1. find . -type f -perm 644 -exec chmod 664 {} \;

유사한 방식으로 디렉터리 권한을 변경할 수도 있습니다.

  1. find . -type d -perm 755 -exec chmod 700 {} \;

이 예제는 권한이 755로 설정된 모든 디렉터리를 찾은 다음 권한을 700으로 수정합니다.

찾기를 사용하여 파일 찾기

find를 사용하는 대신 locate 명령을 사용할 수 있습니다. 이 명령은 종종 더 빠르고 전체 파일 시스템을 쉽게 검색할 수 있습니다.

패키지 목록을 업데이트한 다음 mlocate 패키지를 설치하여 apt를 사용하여 Debian 또는 Ubuntu에 명령을 설치할 수 있습니다.

  1. sudo apt update
  2. sudo apt install mlocate

Rocky Linux, CentOS 및 기타 RedHat 파생 배포판에서는 대신 dnf 명령을 사용하여 mlocate를 설치할 수 있습니다.

  1. sudo dnf install mlocate

locatefind보다 빠른 이유는 파일 시스템의 모든 파일을 나열하는 데이터베이스에 의존하기 때문입니다. 이 데이터베이스는 일반적으로 cron 스크립트를 사용하여 하루에 한 번 업데이트되지만 updatedb 명령을 사용하여 수동으로 업데이트할 수 있습니다. 지금 sudo 권한으로 이 명령을 실행하십시오.

  1. sudo updatedb

새 파일을 찾으려면 locate 데이터베이스가 항상 최신 상태여야 합니다. cron 스크립트가 실행되기 전이나 updatedb 명령을 실행하기 전에 새 파일을 추가하면 쿼리 결과에 나타나지 않습니다.

locate를 사용하면 다양한 방법으로 결과를 필터링할 수 있습니다. 파일을 찾는 데 사용할 수 있는 가장 기본적인 방법은 다음 구문을 사용하는 것입니다.

  1. locate query

이는 파일 경로에 query 문자열이 포함된 모든 파일 및 디렉토리와 일치합니다. 이름에 쿼리 자체가 포함된 파일만 반환하려면 디렉토리에 쿼리가 있는 모든 파일 대신 -b 플래그를 포함하여 "basename이 있는 파일만 검색할 수 있습니다. \는 검색어와 일치합니다.

  1. locate -b query

locate가 파일 시스템에 여전히 존재하는 결과만 반환하도록 하려면(마지막 updatedb 호출과 현재 locate 호출 사이에 제거되지 않은 파일을 의미함) ), -e 플래그를 사용합니다.

  1. locate -e query

locate-S 옵션을 사용하여 카탈로그화한 정보에 대한 통계를 검색할 수 있습니다.

  1. locate -S
Output
Database /var/lib/mlocate/mlocate.db: 21015 directories 136787 files 7727763 bytes in file names 3264413 bytes used to store database

이는 시스템에 얼마나 많은 파일과 디렉토리가 존재하는지에 대한 높은 수준의 이해를 얻는 데 유용할 수 있습니다.

결론

findlocate 명령은 모두 시스템에서 파일을 찾는 데 유용한 도구입니다. 둘 다 파이프라인을 통해 다른 유틸리티와 결합하여 강화할 수 있는 강력한 명령이지만 주어진 상황에 적합한 도구를 결정하는 것은 사용자에게 달려 있습니다.

여기에서 findlocate로 실험을 계속하는 것이 좋습니다. 해당 man 페이지를 읽고 이 가이드에서 다루지 않은 다른 옵션에 대해 알아볼 수 있으며 검색 결과를 wc, <와 같은 다른 명령으로 파이핑하여 분석하고 조작할 수 있습니다.sort 및 grep.