리눅스에서 파일 및 명령어 찾기

CompTIABeginner
지금 연습하기

소개

이 실습에서는 리눅스 커맨드라인 환경에서 파일과 명령어를 찾는 필수 기술을 습득하게 됩니다. 먼저 강력한 find 명령어를 사용하여 이름 기반의 기본 검색 방법을 배우고, 더 유연한 패턴 매칭을 위해 와일드카드를 활용하는 방법을 익힙니다. 이 실습 과정에서는 검색 기술을 안전하게 연습할 수 있도록 샘플 디렉토리 구조를 직접 생성하며 진행합니다.

기초를 다진 후에는 -execxargs를 사용하여 검색 결과에 대해 직접 명령어를 실행하는 방법을 살펴봅니다. 또한 데이터베이스 기반의 빠른 검색 도구인 locate, 명령어의 바이너리와 매뉴얼을 찾는 whereis, 그리고 명령어 실행 경로를 분석하는 alias, which, type과 같은 특화된 검색 도구들도 함께 다룹니다. 실습을 마칠 때쯤이면 리눅스의 어떤 파일이나 명령어 검색 작업에서도 상황에 맞는 적절한 도구를 선택할 수 있는 숙련도를 갖추게 될 것입니다.

이 과정은 학습과 연습을 돕기 위해 단계별 지침을 제공하는 가이드 실습 (Guided Lab) 입니다. 각 단계를 완료하고 실무 경험을 쌓으려면 지침을 주의 깊게 따르십시오. 과거 데이터에 따르면 이 실습은 완료율 96%초급 수준이며, 학습자들로부터 100%의 긍정적인 평가를 받았습니다.

find 와 와일드카드를 사용한 기본 파일 검색

이 단계에서는 리눅스 커맨드라인에서 파일과 디렉토리를 검색하는 가장 강력한 도구 중 하나인 find 명령어의 사용법을 배웁니다. 기본적인 이름 기반 검색부터 시작하여 파일 패턴을 찾기 위한 와일드카드 활용법을 소개합니다.

먼저 연습을 위한 전용 디렉토리와 샘플 파일들을 생성하겠습니다. 이렇게 하면 파일 시스템의 다른 부분에 영향을 주지 않고 find가 어떻게 작동하는지 제어된 환경에서 확인할 수 있습니다.

  1. 현재 위치가 올바른 시작 디렉토리인지 확인합니다. 이 실습의 모든 작업은 ~/project 내부에서 진행됩니다.
cd ~/project
  1. find_lab이라는 새 디렉토리를 만들고 해당 디렉토리로 이동합니다.
mkdir find_lab
cd find_lab
  1. 이제 검색 연습을 위해 파일 세트와 하위 디렉토리를 생성하겠습니다. 빈 파일을 만들기 위해 touch 명령어를 사용하고, 디렉토리를 만들기 위해 mkdir을 사용합니다.
touch file1.txt file2.log report.txt File1.TXT
mkdir subdir
touch subdir/file3.txt subdir/another.log

현재 디렉토리와 하위 디렉토리의 파일을 재귀적으로 나열하는 ls -R 명령어로 구조를 확인할 수 있습니다.

ls -R

다음과 유사한 출력이 표시되어야 합니다.

.:
File1.TXT  file1.txt  file2.log  report.txt  subdir

./subdir:
another.log  file3.txt

테스트 환경이 준비되었으므로 검색을 시작해 보겠습니다.

find 명령어의 기본 구문은 find [path] [expression]입니다. [path]는 검색을 시작할 위치를 지정하고, [expression]은 찾고자 하는 대상을 정의합니다.

정확한 파일 이름으로 검색하기

정확한 이름으로 파일을 찾으려면 -name 표현식을 사용합니다. report.txt 파일을 찾아보겠습니다. 경로로는 현재 디렉토리부터 검색을 시작하도록 지시하는 .을 사용합니다.

find . -name "report.txt"

출력 결과에 찾은 파일의 경로가 표시됩니다.

./report.txt

와일드카드를 사용한 검색

와일드카드를 사용하면 패턴을 기반으로 파일을 검색할 수 있습니다. 가장 일반적인 와일드카드는 임의의 문자열과 일치하는 별표 (*) 입니다.

find 명령어가 실행되기 전에 쉘이 와일드카드를 먼저 해석하지 않도록 패턴을 큰따옴표 (") 로 묶는 것이 좋습니다.

확장자가 .txt로 끝나는 모든 파일을 찾아보겠습니다.

find . -name "*.txt"

find는 현재 디렉토리 (.) 와 모든 하위 디렉토리를 재귀적으로 검색합니다.

./file1.txt
./report.txt
./subdir/file3.txt

-name은 대소문자를 구분하기 때문에 File1.TXT는 검색되지 않았음을 주목하세요. 대소문자를 구분하지 않고 검색하려면 -iname (insensitive name) 표현식을 사용합니다.

find . -iname "*.txt"

이제 대소문자에 관계없이 .txt로 끝나는 모든 파일이 출력에 포함됩니다.

./file1.txt
./report.txt
./File1.TXT
./subdir/file3.txt

파일 유형별 검색

-type 표현식을 사용하여 파일이나 디렉토리와 같은 특정 유형의 객체만 찾도록 지시할 수도 있습니다. 일반 파일은 -type f를, 디렉토리는 -type d를 사용합니다.

현재 위치 내에서 디렉토리만 찾아보겠습니다.

find . -type d

출력 결과에 현재 디렉토리 (.) 와 우리가 만든 subdir이 나열됩니다.

.
./subdir

여러 표현식을 조합하여 더 구체적인 검색을 수행할 수 있습니다. 예를 들어, 이름이 .log로 끝나는 파일 (디렉토리 제외) 만 찾으려면 다음과 같이 입력합니다.

find . -type f -name "*.log"

이 명령어는 파일이면서 동시에 이름이 .log로 끝나는 모든 항목을 찾습니다.

./file2.log
./subdir/another.log

지금까지 이름 패턴과 유형 필터를 사용하여 find를 사용하는 기본 방법을 배웠습니다. 다음 단계에서는 이 명령어의 더 고급 기능들을 살펴보겠습니다.

find -execxargs 를 사용하여 검색 결과에 작업 실행하기

이 단계에서는 단순히 파일을 나열하는 것을 넘어, find 명령어로 찾은 파일에 대해 직접 명령어를 실행하는 방법을 배웁니다. 이는 권한 변경, 파일 삭제 또는 사용자 정의 스크립트 실행과 같은 대량 작업을 수행할 때 매우 강력한 기술입니다. find-exec 옵션과 xargs 명령어라는 두 가지 주요 방법을 다룹니다.

이전 단계에서 작업하던 ~/project/find_lab 디렉토리에서 계속 진행합니다. 먼저 올바른 디렉토리에 있는지 확인하세요.

cd ~/project/find_lab

find -exec 사용하기

-exec 옵션을 사용하면 find가 찾은 각 파일에 대해 임의의 명령어를 실행할 수 있습니다. 구문이 처음에는 다소 생소할 수 있습니다.

find [path] [expression] -exec [command] {} \;

  • [command]: 실행하려는 명령어 (예: ls -l, rm, chmod).
  • {}: 특수 플레이스홀더입니다. find는 현재 찾은 파일의 전체 경로로 {}를 대체합니다.
  • \;: -exec 명령의 필수 종료 문자입니다. 쉘이 세미콜론을 특수 문자로 해석하지 못하도록 백슬래시 (\) 가 반드시 필요합니다.

직접 시도해 봅시다. 확장자가 .txt인 모든 파일을 찾아 각 파일의 상세 정보를 확인하기 위해 ls -l을 실행해 보겠습니다.

find . -name "*.txt" -exec ls -l {} \;

출력 결과는 찾은 각 .txt 파일에 대해 ls -l이 실행된 결과를 보여줍니다.

-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./file1.txt
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./report.txt
-rw-rw-r-- 1 labex labex 0 Jun 26 09:45 ./subdir/file3.txt

안전을 위해 find-ok 옵션을 제공합니다. 이는 -exec와 동일하게 작동하지만, 각 파일에 대해 명령어를 실행하기 전에 사용자에게 확인을 요청합니다. 파일 삭제 (rm) 와 같은 파괴적인 작업을 수행할 때 적극 권장됩니다.

앞서 생성한 .log 파일을 삭제해 보되, 이번에는 안전을 위해 -ok를 사용하겠습니다.

find . -name "*.log" -ok rm {} \;

파일을 찾을 때마다 find가 확인을 요청합니다. 삭제를 승인하려면 y를 입력하고 Enter 를 누르세요.

< rm ... ./file2.log > ? y
< rm ... ./subdir/another.log > ? y

확인 후 디렉토리 내용을 나열하여 파일이 삭제되었는지 확인할 수 있습니다.

ls -R
.:
File1.TXT  file1.txt  report.txt  subdir

./subdir:
file3.txt

xargs 사용하기

-exec의 대안은 find의 출력을 xargs 명령어로 파이프하는 것입니다. xargs는 표준 입력 (여기서는 find가 제공하는 파일 경로) 에서 항목을 읽어 해당 항목들을 인자로 사용하여 지정된 명령어를 실행합니다.

xargs의 주요 장점은 효율성입니다. -exec ... \;는 모든 파일에 대해 명령어를 매번 실행하는 반면, xargs는 파일 경로들을 그룹화하여 한 번에 많은 인자를 전달함으로써 명령어 실행 횟수를 줄입니다.

먼저, 작업할 대상을 만들기 위해 방금 삭제한 로그 파일들을 다시 생성하겠습니다.

touch file2.log subdir/another.log

이제 findxargs를 사용하여 .log 파일의 상세 정보를 나열해 보겠습니다.

find . -name "*.log" | xargs ls -l

출력은 -exec 예제와 유사하지만 명령어 구조가 다릅니다.

-rw-r--r-- 1 labex labex 0 <date> <time> ./file2.log
-rw-r--r-- 1 labex labex 0 <date> <time> ./subdir/another.log

find -ok와 마찬가지로 xargs-p 옵션을 사용하여 "확인" 모드를 사용할 수 있습니다. 실행하려는 명령어를 표시하고 사용자에게 확인을 요청합니다.

이를 사용하여 .log 파일을 다시 삭제해 보겠습니다.

find . -name "*.log" | xargs -p rm

xargs는 파일들을 하나의 rm 명령어로 그룹화하고 확인을 요청합니다. y를 입력하고 Enter 를 누르세요.

rm ./file2.log ./subdir/another.log ?...y

이제 검색 결과에 대해 작업을 수행하는 두 가지 방법인 -execxargs를 모두 성공적으로 사용해 보았습니다. 이는 리눅스에서 작업을 자동화하는 데 필수적인 기술입니다.

빠른 데이터베이스 기반 검색을 위해 locateupdatedb 사용하기

이 단계에서는 find의 대안인 locate에 대해 배웁니다. find가 실시간으로 파일 시스템을 검색하는 반면, locate는 미리 구축된 파일 경로 데이터베이스를 검색합니다. 이로 인해 locate는 훨씬 빠르지만, 데이터베이스가 마지막으로 업데이트되었을 당시에 존재했던 파일만 찾을 수 있다는 중요한 단점이 있습니다.

~/project 디렉토리에서 작업을 계속합니다. 먼저 필요한 도구가 설치되어 있는지 확인하겠습니다.

  1. locate 명령어는 mlocate 패키지에서 제공하며, 기본적으로 설치되어 있지 않을 수 있습니다. 다음 명령어를 실행하여 패키지 목록을 업데이트하고 설치하세요. 시스템 전체에 설치하는 작업이므로 sudo를 사용합니다.
sudo apt-get update && sudo apt-get install -y mlocate

패키지 설치 과정이 표시될 것입니다.

  1. 이제 이전 단계에서 만든 테스트 디렉토리로 이동합니다.
cd ~/project/find_lab
  1. locate를 사용하여 report.txt 파일을 찾아보세요.
locate report.txt

많은 시스템에서 locate 데이터베이스가 자동으로 업데이트되므로 파일이 즉시 보일 수 있습니다.

/home/labex/project/find_lab/report.txt

파일 경로가 보인다면 데이터베이스에 최근 생성된 파일 정보가 이미 포함되어 있음을 의미합니다. 이는 시스템이 백그라운드에서 자동으로 데이터베이스 업데이트를 실행할 때 발생할 수 있습니다.

  1. 만약 3 단계에서 아무런 출력도 보이지 않는다면 데이터베이스를 수동으로 업데이트해야 합니다. updatedb 명령어를 사용하여 데이터베이스를 다시 구축하세요.
sudo updatedb

이 명령어는 출력을 생성하지 않지만 백그라운드에서 작동합니다. 완료하는 데 잠시 시간이 걸릴 수 있습니다.

  1. updatedb를 실행한 후 (필요한 경우), 다시 locate 명령어를 시도해 보세요.
locate report.txt

이제 파일 경로가 정상적으로 표시되어야 합니다.

/home/labex/project/find_lab/report.txt

로컬 데이터베이스의 한계 이해하기

데이터베이스가 마지막으로 업데이트된 후 새 파일을 생성하면 어떻게 되는지 살펴보겠습니다.

  1. 먼저 find_lab 디렉토리에 새 파일을 만듭니다.
touch special_report.pdf
  1. 이 새 파일을 locate로 찾아보세요.
locate special_report.pdf

시스템 데이터베이스가 아주 최근에 업데이트되지 않았다면, 데이터베이스가 이 새 파일의 존재를 아직 모르기 때문에 아무런 출력도 나오지 않을 것입니다.

  1. 시스템 데이터베이스 업데이트를 강제할 수 있습니다.
sudo updatedb
  1. 이제 다시 파일을 찾아보세요.
locate special_report.pdf

이제 다음과 같이 표시되어야 합니다.

/home/labex/project/find_lab/special_report.pdf

데이터베이스 업데이트 빈도 이해하기

핵심은 locate가 데이터베이스의 최신 상태에 의존한다는 점입니다. 실제 운영 시스템에서는 다음과 같습니다.

  • 시스템은 일반적으로 locate 데이터베이스를 자동으로 업데이트합니다 (보통 cron 작업을 통해 매일 수행).
  • 즉각적인 결과가 필요할 때는 sudo updatedb로 수동 업데이트할 수 있습니다.
  • locate는 파일 시스템을 스캔하는 대신 미리 구축된 인덱스를 검색하므로 매우 빠릅니다.
  • 아주 최근에 생성된 파일을 찾으려면 실시간으로 검색하는 find가 더 신뢰할 수 있습니다.

이제 locate가 미리 구축된 데이터베이스를 사용하여 어떻게 번개처럼 빠른 검색을 제공하는지 배웠으며, updatedb를 통해 데이터베이스를 최신 상태로 유지하는 것의 중요성을 이해하게 되었습니다.

whereis 로 명령어 바이너리 및 매뉴얼 위치 찾기

이 단계에서는 명령어의 바이너리, 소스 및 매뉴얼 페이지 파일을 찾는 데 특화된 명령어인 whereis 사용법을 배웁니다. 일반적인 파일 검색을 위한 findlocate와 달리, whereis는 시스템 명령어와 관련된 필수 파일들을 빠르게 찾는 데 최적화되어 있습니다. 표준 리눅스 디렉토리의 미리 정의된 목록을 검색하므로 매우 빠릅니다.

whereis 명령어를 살펴보겠습니다. whereis는 현재 위치를 기준으로 검색하지 않으므로 어떤 디렉토리에 있어도 상관없습니다. 일관성을 위해 ~/project 디렉토리에 머물겠습니다.

cd ~/project
  1. 사용자 비밀번호를 변경하는 데 사용되는 passwd 명령어의 위치를 찾아보겠습니다.
whereis passwd

출력 결과에는 명령어 이름 뒤에 바이너리 실행 파일의 경로와 관련 매뉴얼 페이지의 경로가 표시됩니다.

passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
  • /usr/bin/passwd: 실행 프로그램입니다.
  • /etc/passwd: passwd 명령어가 상호작용하는 시스템의 사용자 데이터베이스 파일입니다. whereis는 종종 결과에 중요한 설정 파일을 포함합니다.
  • /usr/share/man/...: 명령어에 대한 압축된 매뉴얼 페이지들입니다.
  1. 특정 유형의 파일만 표시하도록 결과를 필터링할 수 있습니다. passwd와 관련된 바이너리 파일만 보려면 -b (binary) 플래그를 사용합니다.
whereis -b passwd

이렇게 하면 매뉴얼 페이지를 제외하고 실행 파일 및 관련 파일로 출력이 좁혀집니다.

passwd: /usr/bin/passwd /etc/passwd
  1. 마찬가지로 매뉴얼 페이지인 것만 찾으려면 -m (manual) 플래그를 사용합니다. 이는 명령어에 대해 어떤 문서가 제공되는지 알고 싶을 때 유용합니다.
whereis -m passwd

이제 매뉴얼 페이지 위치만 나열됩니다.

passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
  1. whereis의 한계를 이해하는 것이 중요합니다. 이 명령어는 표준 시스템 디렉토리만 검색합니다. find_lab 디렉토리에 만든 report.txt 파일을 찾아보겠습니다.
whereis report.txt

명령어는 파일 이름만 반환하고 경로는 표시하지 않습니다.

report.txt:

이는 report.txt가 홈 디렉토리 (~/project/find_lab) 에 있기 때문이며, 이곳은 시스템 바이너리나 매뉴얼 페이지가 위치하는 표준 장소가 아닙니다. 여기서 핵심적인 차이점이 드러납니다. 개인 파일이나 프로젝트 파일을 찾을 때는 findlocate를 사용하고, 시스템 명령어를 조사할 때는 whereis를 사용하세요.

이제 리눅스 명령어를 구성하는 파일들을 빠르게 찾는 whereis 사용법을 배웠습니다. 이는 시스템 관리 및 문제 해결에 유용한 기술입니다.

alias, which, type 으로 명령어 경로 분석하기

마지막 단계에서는 사용자가 명령어 이름을 입력했을 때 쉘이 어떤 명령어를 실행할지 결정하는 과정을 살펴봅니다. 이것이 항상 디스크에서 파일을 찾는 것만큼 간단하지는 않습니다. 쉘은 특정 우선순위를 가집니다. 먼저 **별칭 (alias)**을 확인하고, 그다음 **쉘 내장 명령어 (shell built-in)**를 확인하며, 마지막으로 시스템의 **$PATH**에 나열된 디렉토리에서 실행 파일을 검색합니다. alias를 사용하여 명령어 단축키를 만드는 방법과 which, type을 사용하여 명령어 이름이 실제로 무엇을 가리키는지 진단하는 방법을 배웁니다.

먼저 임시 별칭을 만들어 명령어 실행에 어떤 영향을 주는지 확인해 보겠습니다. ~/project 디렉토리에서 진행합니다.

  1. 별칭 (alias) 은 다른 명령어에 대해 사용자가 정의한 단축키입니다. pwd 명령어 (현재 작업 디렉토리 출력) 를 실행했을 때 대신 date 명령어가 실행되도록 별칭을 만들어 보겠습니다.
alias pwd='date'
  1. 이제 pwd 명령어를 실행해 보세요.
pwd

별칭이 우선순위를 갖기 때문에 현재 디렉토리를 출력하는 대신 현재 날짜와 시간이 출력됩니다.

<현재 날짜와 시간>

whichtype으로 조사하기

이제 별칭이 설정된 사실을 모른다고 가정해 봅시다. pwd가 왜 다르게 작동하는지 어떻게 찾아낼 수 있을까요? 이때 whichtype이 유용합니다.

  1. which 명령어는 $PATH 환경 변수에 나열된 디렉토리에서 실행 파일의 위치를 찾습니다.
which pwd

출력 결과는 다음과 같습니다.

pwd: aliased to date
  1. type 명령어는 더 포괄적입니다. 이는 쉘 내장 명령어로, 별칭과 내장 함수를 포함하여 쉘이 명령어 이름을 어떻게 해석하는지 설명해 줍니다.
type pwd

이 명령어는 상황을 정확하게 식별합니다.

pwd is an alias for date
  1. 이름과 일치하는 모든 가능한 명령어를 보려면 -a (all) 플래그를 사용할 수 있습니다. 이는 type과 함께 사용할 때 특히 강력합니다.
type -a pwd

이렇게 하면 pwd라는 이름에 대한 전체 계층 구조가 드러납니다.

pwd is an alias for date
pwd is a shell builtin
pwd is /usr/bin/pwd
pwd is /bin/pwd

이 출력은 쉘의 우선순위를 알려줍니다. 쉘은 별칭을 가장 먼저 사용합니다. 별칭이 없다면 쉘 내장 pwd 명령어를 사용했을 것입니다. 둘 다 없다면 /usr/bin/pwd에 위치한 프로그램을 실행했을 것입니다.

별칭 제거하기

마지막으로, 별칭을 제거하여 실험 환경을 정리하겠습니다.

  1. unalias 명령어는 현재 쉘 세션에서 별칭 정의를 제거합니다.
unalias pwd
  1. 이제 pwdtype pwd를 다시 실행하여 모든 것이 정상으로 돌아왔는지 확인합니다.
pwd

출력:

/home/labex/project
type pwd

출력:

pwd is a shell builtin

이제 별칭을 만들고 제거하는 방법과, 더 중요한 것은 whichtype을 사용하여 쉘이 정확히 어떤 명령어를 실행할지 이해하는 방법을 배웠습니다.

요약

이 실습에서는 리눅스 파일 시스템 전체에서 파일과 디렉토리를 검색하는 방법을 배웠습니다. 강력한 find 명령어를 사용하여 이름 기반 기준과 와일드카드로 기본 검색을 수행하는 것부터 시작하여, -execxargs를 통해 검색 결과에 명령어를 실행하는 고급 기술까지 익혔습니다. 또한 더 빠르고 데이터베이스 기반인 대안으로 locate 명령어를 살펴보고, updatedb를 통해 데이터베이스를 유지 관리하는 방법도 배웠습니다.

더불어, 명령어를 찾고 분석하는 기술도 다루었습니다. whereis를 사용하여 명령어 바이너리와 매뉴얼 페이지의 위치를 찾았습니다. 명령어 실행 경로를 이해하기 위해 which를 사용하여 호출되는 특정 실행 파일을 식별하고, type을 사용하여 명령어가 별칭인지, 내장 명령어인지, 아니면 파일인지 확인하는 동시에 별칭이 명령어 동작에 미치는 영향을 분석했습니다.