파일을 찾는 명령어로는 find
와 locate
가 있다.
find <검색할 디렉터리> <검색 조건> <액션>
find
명령어를 실행하면 인자로 지정한 <검색할 디렉터리>
를 기점으로 <검색 조건>
을 만족하는 파일을 찾아서 <액션>
을 실행한다.
여기서 <검색 조건>
에 아무런 조건도 지정하지 않으면 지정한 디렉터리 안의 모든 파일과 디렉터리를 대상으로 액션이 실행된다.
find-1.txt
를 찾아서 경로를 출력한다.
이처럼 find
명령어는 지정한 디렉터리 트리를 내려가면서 검색 조건에 일치하는 파일을 검색한다. 따라서 디렉터리가 깊게 중첩되어 있어도 파일을 쉽게 찾을 수 있다.
사용 가능한 검색 조건
- -name, -iname
파일 이름으로 검색하려면 사용한다.-name
은 대소문자를 구별하지만-iname
은 구별하지 않는다.
파일 이름에는 와일드카드로*
나?
로 사용할 수 있으며 경로 확장처럼*
는 임의의 문자열을,?
는 임의의 한 문자를 의미한다.
-name
으로 이름을 지정할 때 와일드카드를 사용한다면 반드시'
(작은따옴표)로 감싸주어야 한다. 그래야 배시의 경로 확장이 적용되지 않는다.
만약 작은따옴표로 감싸지 않으면*
가 배시에 의해 확장되어find
명령어에 전달된다.
find
뿐만 아니라 모든 명령어를 실행할 때*
와 같이 셸이 변환되는 문자(메타 문자)를 인자로 지정할 때는 주의를 기울여야 한다.- 파일 형식으로 찾기 -type
-type f
: 보통 파일,type d
: 디렉터리,type l
: 심볼릭 링크
-a
(AND)를 사용하여 검색 조건을 여러 개 지정할 수 있다. (생략 가능)
1.find . -type f -a -name '*.txt' -print
2.find . -type f -name '*.txt' -print
- locate : 데이터베이스에서 파일 찾기
경로의 일부를 지정하여 파일을 찾을 때 사용하는 명령어.
이때 전용 데이터베이스에서 검색하므로 그 자리에서 디스크를 스캔해서 파일을 찾는find
보다 훨씬 빠르다.
별도로 설치를 해주어야 하는데,locate
명령어는mlocate
라는 패키지에 포함되어 있기에 우분투에서는apt-get
명령어로 다음과 같이 설치한다.
다음으로는 파일 경로 목록을 데이터베이스에 등록해야 한다. 다음과 같이 슈퍼 사용자 권한으로updatedb
명령어를 실행하면 데이터베이스가 만들어진다.
locate
를 설치하면updatedb
가 주기적으로 실행되도록 설정.
앞서 소개한find
는 실행할 때마다 디렉터리 트리를 탐색해서 많은 파일이 저장된 디스크를 검색할 때는 시간이 오래 걸린다. 하지만locate
는 사전에 만든 데이터베이스를 활용하기 때문에 검색 속도가 빠르다.find
로 몇 분 걸릴 만한 검색도locate
로는 몇 초만에 끝나는 것.
locate
명령어는 기본적으로 데이터베이스를 하루에 한 번 만들도록 설정.
1.locate
로 검색된 파일이 실제로는 디스크에 존재하지 않을 수 있다.
2.locate
로 검색되지 않았지만 실제로는 존재할 수 있다.
즉, 방금 전에 만든 파일은locate
명령어로 검색되지 않는다.
따라서locate
명령어는 시스템에 원래부터 있었던 파일이나 며칠 전에 만든 파일을 빠르게 검색할 때 사용한다고 생각하면 된다.
- 대소문자 상관없이 검색을 원한다면
i
혹은--ignore-case
옵션을 지정한다.
파일 이름만으로 검색할 때는-b
혹은--basename
옵션을 지정한다.
locate
는 지정한 문자열 패턴이 파일 경로에 있으면 전부 출력한다. 예를 들어/usr/share/python3
라는 디렉터리 아래에 있는 파일은 디렉터리에 이미python
이란 문자열을 포함하므로 전부 출력된다.
이때-b
옵션을 지정하면, 이를테면/usr/share/python3'debian_defaults
와 같은 파일은 출력되지 않는다. 즉, 파일 경로가 아니라 이름에python
이 포함되어야 출력된다.
검색 패턴 여러 개를 지정하게 되면 OR 조건으로 검색한다.
ex)locate docs document
:docs
혹은document
를 포함하는 파일 검색
여러 검색 패턴을 모두 만족하는 파일을 검색할 때에는-A
혹은-all
옵션(AND)을 사용한다.
ex)locate -A bash doc
:bash
와doc
를 포함하는 파일 검색
리눅스 시스템에 내장된 메뉴얼 확인
리눅스의 명령어는 대부분 --help
라는 옵션을 제공. 명령어에 대한 도움말이 출력된다.
출력되는 내용은 명령어마다 다르지만 대부분 다음과 같은 내용을 포함한다
지정한 명령어의 온라인 메뉴얼을 출력한다.
전통적인 리눅스의 기본 메뉴얼로서 대부분의 명령어에 대해 --help
옵션보다 훨씬 자세한 내용을 담고 있다. 또한 리눅스의 설정 파일이나 라이브러리에 대한 설명도 포함하고 있다.
보통 다음과 같은 항목을 포함한다.
명령어 이름을 모르는 경우에는 -k
를 사용하여 키워드로 메뉴얼을 검색할 수 있다.
그리고 명령어 뒤에 붙은 괄호 안의 숫자는 섹션 번호를 의미한다.
섹션
번호 1 : 명령어
번호 2 : 시스템콜
번호 3 : 라이브러리 함수
번호 4 : 디바이스 파일
번호 5 : 파일 서식
번호 6 : 게임
번호 7 : 기타
번호 8 : 시스템 관리 명령어
번호 9 : 커널 루틴
man <섹션 번호> <이름>
섹션 번호를 생략하면 섹션 번호의 값이 제일 작은 메뉴얼이 출력된다.
ex)
man 1 crontab
: 섹션 1 (명령어) crontab 메뉴얼 표시
man 5 crontab
: 섹션 5 (파일 서식) crontab 메뉴얼 표시
man crontab
: 번호가 작은 섹션1(명령어) crontab 메뉴얼 표시
특정 명령어가 어떤 섹션에 포함되어 있는지를 확인하려면 다음과 같이-wa
옵션을 사용한다.
다음과 같이 메뉴얼 페이지의 실제 파일 경로가 출력된다. 파일 경로를 보면 해당 메뉴얼이 어떤 섹션에 속하는지 확인할 수 있다.
리눅스 명령어의 실체는 파일이다. 예를 들어 cat
명령어의 실체는 /bin
디렉터리 아래에 /bin/car
이라는 파일이다.
하지만 우리가 cat
을 사용할 때는 /bin/cat
이라고 입력하지 않고 cat
이라고 입력한다. 이는 셸이 $PATH
라는 환경 변수에 저장된 장소에서 명령어를 찾도록 되어 있기 때문이다.
다음과 같이 셸이 명령어를 찾는 위치가 어딘가에 기록되어 있다고 생각하자.
위에서 출력된 문자열은 디렉터리를 :
으로 연결한 것이다. cat
명령어를 실행하면 다음 그림과 같이 $PATH
로 지정한 디렉터리에서 명령어를 찾는다.
$PATH
에서 설정된 디렉터리를 패스(path)
라고 한다. 패스를 설정해 두면 명령어가 실제 어디에 있든 명령어의 이름만으로 실행하는 것이 가능해진다.
명령어 파일의 실제 위치는 which
명령어를 사용해 확인할 수 있다.