find
find 명령어 리눅스의 find 명령어는 리눅스 파일 시스템에서 파일을 검색하는 데 사용되는 명령어입니다. 다양한 표현식을 사용하여 원하는 파일의 목록을 추출할 수 있습니다.
리눅스 find 사용법
find [옵션] [경로] [표현식]
# 현재 위치에서 log가 들어가는 파일 모두 찾기
find . -name "*log*"
옵션
- P : 심볼릭 링크를 따라가지 않고, 심볼릭 링크 자체 정보 사용.
- L : 심볼릭 링크에 연결된 파일 정보 사용.
- H : 심볼릭 링크를 따라가지 않으나, Command Line Argument를 처리할 땐 예외.
- D : 디버그 메시지 출력.
경로
find의 인자값으로는 경로를 받습니다. 상대 경로, 절대 경로 모두 가능하며 대부분의 리눅스의 경우 이 경로 인자 값을 생략한다면 현재 위치(.)를 입력받은 것으로 간주하지만 유닉스의 경우 이 경로를 입력받지 않으면 명령어 실행이 안되니 유의하셔야 합니다.
표현식
- name : 해당 이름의 파일을 찾음. 해당 이름에는 정규 표현식을 활용할 수 있음
- type : 지정된 파일 타입에 해당하는 파일 검색
- user : 해당 유저에게 속한 파일 검색
- empty : 빈 디렉토리 혹은 크기가 0인 파일 검색
- delete : 검색된 파일 혹은 디렉토리 삭제
- exec : 검색된 파일에 대해 지정된 명령 실행
- path : 지정된 문자열 패턴에 해당하는 경로에서 검색.
- print : 검색 결과를 출력. 검색 항목은 newline으로 구분. (기본 값)
- print0 : 검색 결과를 출력. 검색 항목은 null로 구분.
- size : 파일 크기를 사용하여 파일 검색.
- mindepth : 검색을 시작할 하위 디렉토리 최소 깊이 지정.
- maxdepth : 검색할 하위 디렉토리의 최대 깊이 지정.
- atime : n일 이내에 액세스된 파일을 찾음.
- ctime : n일 이내에 만들어진 파일을 찾음.
- mtime : n일 이내에 수정된 파일을 찾음.
- cnewer file : 해당 파일보다 최근에 수정된 파일을 찾음.
find 명령어는 다른 명령어와는 달리 옵션은 거의 사용되지 않고 이 표현식을 통해 찾을 타깃을 정합니다. 이 표현식은 중첩을 통해 대상 범위를 더 줄일 수도 있습니다.
리눅스 find 사용 예시
파일명으로 찾기 (-name)
# 현재 디렉토리에서 test가 포함되는 파일 찾기
find . -name "*test*"
# 현재 디렉토리에서 .txt 확장자 모두 찾기
find . -name "*.txt"
# 현재 디렉토리에서 .txt 확장자 파일 검색 후 모두 삭제
find . -name "*.txt" -delete
# 현재 디렉토리에서 test로 시작되는 파일 찾기
find . -name "test*"
# 현재 디렉토리에서 test로 끝나는 파일 찾기
find . -name "*test"
가장 많이 사용되는 표현식은 name입니다. 와일드 카드 * 를 포함하여 자신이 원하는 파일들과 확장자들을 찾아서 나열할 수 있습니다.
타입으로 찾기 (-type)
# 현재 디렉토리에서 모든 디렉토리 찾기
find . -type d
# 현재 디렉토리에서 test가 들어가는 디렉토리 찾기
find . -name "*test*" -type d
# 현재 디렉토리에서 모든 파일 찾기
find . -type f
type 을 사용해서 특정 파일 타입만 따로 추출할 수도 있습니다.
- d : 디렉토리
- f : 일반적인 파일
- l : 심볼릭 링크
파일 크기로 찾기 (-empty, -size)
# 현재 디렉토리에서 빈 디렉토리이거나 크기가 0인 파일 검색
find . -empty
# 현재 디렉토리에서 test가 들어가는 빈 디렉토리이거나 크기가 0인 파일 검색하여 삭제
find . -name "*test*" -empty -delete
# 현재 디렉토리에서 1024byte인 파일 검색
find . -size 1024c
# 현재 디렉토리에서 1024byte보다 큰 파일 검색
find . -size +1024c
# 현재 디렉토리에서 1024byte보다 작은 파일 검색
find . -size -1024c
# 현재 디렉토리에서 1kb보다 크고 10kb보다 작은 파일 검색
find . -size +1k -size -10k
empty를 사용하여 빈 디렉토리나 크기가 0인 파일을 찾을 수도 있고 size를 사용하여 파일의 크기로 대상을 찾을수도 있습니다.
- b : 블록단위
- c : byte
- k : kbyte
- w : 2byte 워드
검색된 파일에서 추가 명령 실행하기 (-exec)
# 현재 디렉토리에 "test"가 들어가는 파일을 찾아서 상세정보 출력
find . -name "*test*" -exec ls -l {} \;
# 현재 디렉토리에 있는 파일에서 "test"가 들어가는 내용 찾기
find . -type f -exec grep "test" {} \;
# 현재 디렉토리에 ".txt" 확장자를 찾아서 모두 삭제
find . -name "*.txt" -exec rm {} \;
exec를 사용하여 검색한 대상에 추가 명령어를 수행할 수도 있습니다.
grep
grep 명령어
리눅스에서 grep 명령어는 특정 파일에서 지정한 문자열이나 정규표현식을 포함한 행을 출력해주는 명령어입니다. 특히 tail이나 ls 등 다양한 명령어와 조합하여 응용되는 경우가 많아서 이 grep명령어는 리눅스에서 능숙하게 사용할 줄 알아야 하는 기본 명령어입니다.
리눅스 grep 사용법
Copygrep [옵션][패턴][파일명]
문자열로 찾기
# 특정 파일에서 'error' 문자열 찾기
grep 'error' 파일명
# 여러개의 파일에서 'error' 문자열 찾기
grep 'error' 파일명1 파일명2
# 현재 디렉토리내에 있는 모든 파일에서 'error' 문자열 찾기
grep 'error' *
# 특정 확장자를 가진 모든 파일에서 'error' 문자열 찾기
grep 'error' *.log
grep명령어를 사용하시면 특정 파일에서 내가 원하는 문자열이 있는 라인을 찾을 수 있습니다. 파일은 여러개 지정도 가능합니다. 위와 같이 사용한다면 ‘error’라는 문자열을 mylog.log라는 파일에서 찾을 수 있겠습니다.
정규표현식으로 찾기
# 특정 파일에서 문자열이 포함된 행을 찾는다.
grep '^[ab]' 파일명
# 특정 파일에서 a로 시작하는 모든 단어를 찾는다.
grep 'a*' 파일명
# 특정 파일에서 a로 시작하고 z로 끝나는 5자리 단어를 찾는다.
grep 'a...z' 파일명
# 특정 파일에서 a,b,c로 시작하는 단어를 모두 찾는다.
grep [a-c] 파일명
# 특정 파일에서 apple 또는 Apple로 시작하는 단어를 모두 찾는다.
grep [aA]pple 파일명
# 특정 파일에서 a나 b로 시작되는 모든 행을 찾는다.
grep '^[ab]' 파일명
# 특정 파일에서 apple로 시작되고 0나 9의 숫자로 끝나로 시작되는 모든 행을 찾는다.
grep 'apple'[0-9] 파일명
리눅스에서 grep은 정규표현식으로 특정 문자열을 찾을 수 있는 기능도 제공합니다. 은근히 응용할곳도 많고 자주 사용되니 알아두시면 좋습니다.
자주 사용하는 옵션
- -c : 일치하는 행의 수를 출력한다.
- -i : 대소문자를 구별하지 않는다.
- -v : 일치하지 않는 행만 출력한다.
- -n : 포함된 행의 번호를 함께 출력한다.
- -l : 패턴이 포함된 파일의 이름을 출력한다.
- -w : 단어와 일치하는 행만 출력한다.
- -x : 라인과 일치하는 행만 출력한다.
- -r : 하위 디렉토리를 포함한 모든 파일에서 검색한다.
- -m 숫자 : 최대로 표시될 수 있는 결과를 제한한다.
- -E : 찾을 패턴을 정규 표현식으로 찾는다.
- -F : 찾을 패턴을 문자열로 찾는다.
grep의 종류
명령어 | 설명 | 정규표현식 사용 |
grep | 다중 패턴을 검색한다. | O |
egrep | 정규 표현식 패턴으로 검색한다. | O |
fgrep | 문자열 패턴으로 검색한다. | X |
grep은 3가지 종류가 있습니다. egrp은 정규표현식만으로 검색하는 것이고, fgrep은 문자열로 검색하는 grep을 말하며 각각 grep의 -E, -F 옵션을 사용했을 때와 결과는 같습니다.
실시간 로그 보기 (tail + grep)
Copytail -f mylog.log | grep 192.168.15.86
grep은 다른 명령어와 조합해서 사용하는 경우도 많습니다. 대부분 개발자들이 실시간 로그 체크를 할 때는 tail과 grep 명령어 조합으로 로그파일에서 자신이 원하는 키워드만 추출하고는 합니다. 위의 명령어대로 사용하시면 mylog파일을 실시간으로 액세스하고 IP주소가 192.168.49.16인 행만 추출할 수 있겠습니다.
특정 파일에서 여러개 문자열 찾기
Copycat mylog.txt | grep 'Apple' | grep 'Banana'
파이프를 사용하면 grep명령어를 여러 개 사용하여 특정 파일에서 여러 개의 문자열을 찾을 수 있을 수도 있습니다. 위의 명령어대로 입력한다면 mylog.txt 파일에서 Apple과 Banana이 있는 문자열들을 찾을 수 있겠습니다. |
최대 검색 결과 제한하기
Copygrep -m 100 'Apple' mylog.txt
grep한 결과가 너무 많으면 한도 끝도 없이 스크롤이 내려가는 경우가 생기기 때문에 grep 한 결과를 100개까지만 출력하고 싶다면 -m 옵션을 사용합니다. 위와 같이 사용한다면 mylog.txt의 Apple 문자열을 100개까지만 찾을 수 있겠네요.
grep 한 결과 값 txt 파일로 저장하기
Copygrep -n 'Apple' mylog.txt > result.txt
grep한 결과가 길면 터미널에서 확인이 어렵기 때문에 txt파일로 저장하여 확인하고는 합니다. 위의 명령어대로 입력한다면 mylog.txt 파일에서 Apple이 있는 문자열들을 result.txt 파일에 저장하실 수 있습니다.
history
# 리눅스(linux) history 명령어
리눅스에서 history 명령어는 매우 자주 사용되는 명령어 중 하나입니다. history를 입력하면 **아래와 같이 최근 사용했던 명령어들을 숫자와 함께 출력하여 준다.
history
177 git status
178 git pull
179 cd ~/.ssh
180 ll
181 exit
182 history
위와 같이 간단하게 이 전에 입력했던 커맨드 라인 명령어 히스토리를 조회할 수 있다.
1. 페이지 단위로 보고 싶을 경우
첫 페이지 부터 보여주며 space를 누르면 한 페이지 단위로 이동 함
history | less
2. 마지막 10개의 명령어만 보고 싶은 경우
간략하게 최근 10개만 출력합니다.
hisotry | tail
3. 원하는 개수 만큼만 보여주길 원하는 경우
아래는 각각 마지막 5, 15, 25개를 각각 보여줍니다.
history 5
history 15
history 25
4. history를 grep과 함께 사용하기
이 명령어는 가장 유용하게 사용되는 명령어로 파이프라인과 grep
history | grep git