Post

linux의 유용한 명령어

목차


Linux 간단한 명령

ls (파일 리스트 조회)

옵션

  • a - 숨긴 파일 보기
  • l - 자세히 보기
  • R - 재귀적으로 보기
  • t - 시간순으로 출력
  • SS - 크기순으로 출력
  • h - 파일 사이즈를 보기좋게 출력 (K, M, G 단위로 출력)
  • F - 디렉토리를 보다 보기좋게 출력
  • r - 역순으로 출력

기본적으로 bash에서 ll 을 사용할 경우 ls -al 과 동일한 내용을 출력하게끔 매크로 정의가 되어 있다.

  • ls - 파일 리스트 보기
  • ls -l - 파일 리스트 상세 보기
  • ls -al - 파일 리스트 상세 보기 및 숨긴 파일, 디렉토리 출력
  • ls -alhF - 파일 리스트 상세보기 및 숨긴파일, 디렉토리 출력, 용량과 디렉토리를 보기좋게 출력한다.
  • ls -alt - 제일 최신에 수정된 파일부터 오래된 파일순으로 출력한다.
  • ls -altr - 제일 오래된 파일부터 최신 수정된 파일 순으로 출력한다.
  • ls -alhSS - 파일의 크기가 큰 순에서 작은 순으로 출력하며, 용량을 보기좋게 출력한다.
  • ls -alhSSr - 파일의 크기가 작은 순에서 큰 순으로 출력한다.

cd (경로 이동)

  • ~ - 홈 디렉토리
  • . - 현재 디렉토리
  • .. - 상위 디렉토리

사용법

1
cd <path>

cp (파일, 디렉토리 복사)

  • r - 하위 디렉토리까지 복사
  • f - 복사될 파일이 이미 존재할 경우 덮어씀
  • a - 원본 파일의 속성, 링크까지 모두 복사
  • p - 원본 파일의 소유자 그룹, 권한을 유지하며 복사
1
2
3
4
5
6
cp -r <복사할 파일 또는 디렉토리1> <복사할 파일 또는 디렉토리2> ...중략... <복사될 위치>
# aaa, bbb, ccc를 ddd 디렉토리 안에 복사한다.
cp -r aaa bbb ccc ddd/

# sshkey의 권한을 유지한 채로 /etc/ssh/로 복사한다.
cp -rfp sshkey /etc/ssh/

mv (파일, 디렉토리 이동)

  • f - 이동할 곳에 파일이 존재할 경우 덮어쓴다.
1
2
3
mv <이동할 파일 또는 디렉토리1> <이동할 파일 또는 디렉토리2> ...중략... <복사될 위치>
# 현재 경로의 aaa, bbb, ccc를 ddd 디렉토리로 이동한다.
mv aaa bbb ccc ddd/

rm (파일, 디렉토리 삭제)

  • r - 하위 디렉토리까지 삭제한다.
  • f - 삭제할지 묻지 않고 강제로 삭제한다.
1
2
3
rm -rf  <삭제할 파일 또는 디렉토리1> <삭제할 파일 또는 디렉토리2> ...중략...
# 현재 경로의 aaa, bbb, ccc 디렉토리 및 디렉토리 안의 하위 내용을 모두 삭제한다.
rm -rf  aaa/ bbb/ ccc/

mkdir (디렉토리 생성)

  • p - 생성할 곳에 디렉토리가 없을 경우 재귀적으로 생성한다.
1
2
3
4
5
6
mkdir <생성할 디렉토리명1> <생성할 디렉토리명2> <생성할 디렉토리명3> ... 중략...
# 현재 경로에서 aaa, bbb, ccc 디렉토리를 생성한다.
mkdir aaa/ bbb/ ccc/

# 현재 경로에서 aaa 및 하위 디렉토리가 없을 경우, aaa -> bbb -> ccc 디렉토리를 생성한다.
mkdir -p aaa/bbb/ccc/

touch (파일 생성)

파일을 생성한다.

1
2
3
touch <생성할 파일명1> <생성할 파일명2> <생성할 파일명3>
# 현재 경로에서 aaa.c, bbb.cpp, ccc.json 파일을 생성한다.
touch aaa.c bbb.cpp ccc.json

pwd (현재 경로 확인)

자신이 현재 위치해 있는 경로가 어디인지 확인한다.

  • -P - 심볼릭 링크가 적용되지 않은 실제 경로를 확인한다.

ln (심볼릭 링크 (Windows의 바로가기) 생성)

find (파일 찾기)

디렉토리 내 문자열에 해당하는 파일명을 찾는다.

  • -type - 파일 또는 디렉토리를 검사할 것인지 정한다.
    • -type f - 파일만 찾는다.
    • -type d - 디렉토리만 찾는다.
  • -maxdepth - 하위 경로를 얼마만큼 검사할 것인지 정한다.
    • -maxdepth 1 - 하위 경로를 검사하지 않고 현재 디렉토리의 내용만 검사한다.
  • regex - 정규식 (regular express) 과 매칭되는 파일 및 디렉토리를 검사한다.
  • -exec - 찾을 파일을 인자로 넘겨 명령을 추가 수행할 수 있다.
    • 해당 -exec 옵션을 적절히 사용하면, 찾을 파일에서 추가로 복사, 이동, 삭제, 검색 명령을 수행할 수 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
find <경로> <옵션> "찾을문자열"

# 현재 디렉토리에서 모든 하위 디렉토리를 검사하며 .c 확장자의 파일을 찾는다.
find . -name "*.c" -type f
# test 문자열을 포함하는 디렉토리를 찾는다.
find . -name "*test*" -type d
# _test 문자열로 끝나는 파일을 찾는다.
find . -name "*_test" -type f

# 현재 디렉토리에서 build 디렉토리를 제외하고 CMakeLists.txt 파일과 Makefile 이라는 이름을 가진 파일을 찾는다.
find . ! \( -type d \( -path "./build" \) -prune \) -regex ".*\/\(CMakeLists.txt\|Makefile\)$" -type f

# /etc/ 디렉토리에서 .sh 확장자로 끝나는 파일을 모두 찾는다.
find /etc -name "*.sh" -type f

grep (문자열 찾기)

  • -r - 하위 디렉토리 탐색.
  • -n - 검색 결과 출력 라인 앞에 라인 번호 출력.
  • -I - 바이너리 파일은 검사하지 않음.
  • -F - PATTERN을 정규 표현식(RegEx)이 아닌 일반 문자열로 해석.
  • -E - PATTERN을 확장 정규 표현식(Extended RegEx)으로 해석.
  • -G - PATTERN을 기본 정규 표현식(Basic RegEx)으로 해석.
  • -P - PATTERN을 Perl 정규 표현식(Perl RegEx)으로 해석.
  • -e - 매칭을 위한 PATTERN 전달.
  • -f - 파일에 기록된 내용을 PATTERN으로 사용.
  • -i - 대/소문자 무시.
  • -v - 매칭되는 PATTERN이 존재하지 않는 라인 선택.
  • -w - 단어(word) 단위로 매칭.
  • -x - 라인(line) 단위로 매칭.
  • -z - 라인을 newline(\n)이 아닌 NULL(\0)로 구분.
  • -m - 최대 검색 결과 갯수 제한.
  • -b - 패턴이 매치된 각 라인(-o 사용 시 문자열)의 바이트 옵셋 출력.
  • -H - 검색 결과 출력 라인 앞에 파일 이름 표시.
  • -h - 검색 결과 출력 시, 파일 이름 무시.
  • -o - 매치되는 문자열만 표시.
  • -q - 검색 결과 출력하지 않음.
  • -a - 바이너리 파일을 텍스트 파일처럼 처리.
  • -d - 디렉토리 처리 방식 지정. (read, recurse, skip)
  • -D - 장치 파일 처리 방식 지정. (read, skip)
  • -R - 심볼릭 링크를 따라가며 모든 하위 디렉토리 탐색.
  • -L - PATTERN이 존재하지 않는 파일 이름만 표시.
  • -l - 패턴이 존재하는 파일 이름만 표시.
  • -c - 파일 당 패턴이 일치하는 라인의 갯수 출력.
  • --exclude=<file> - 해당 파일명은 제외하고 검색 (asterik 문자 (*) 를 전체문자로 인식)
  • --exclude-dir=<dir> - 해당 디렉토리는 제외하고 검색 출처 : https://recipes4dev.tistory.com/157
1
2
3
4
5
6
7
8
9
10
# 현재 경로 및 하위 디렉토리의 모든 .c 확장자의 파일을 검사하여
# "include" 문자열이 존재할 경우 해당 라인과 내용을 출력
grep -rnF "include" *.c

# 현재 경로 및 하위 디렉토리의 모든 .c 확장자의 파일을 검사하여
# 모든 if문을 검사하고, if문이 존재할 경우 해당 라인과 내용을 출력
grep -rn "if\(.*\)" *.c

# 응용 : find로 .c, .cpp 확장자를 가진 파일을 찾고, 해당 확장자에서 #include로 시작하는 문자열을 출력한다.
find . -regex ".*\.\(c\|cpp\)" -type f -exec grep -Hn --color "^#include" {} \;

cat (파일 내용을 출력)

1
2
3
4
5
cat <파일명>
# test.c 의 파일내용을 출력한다.
cat test.c
# 응용 : test.c 의 파일내용 중에서, 해당 내용 중 #include 문자열로 시작하는 내용이 있을 경우 모두 찾아 출력한다.
cat test.c | grep "^#include"

현재 파일의 절대경로를 확인할 수 있다.

1
readlink -e <file>

sed (파일 내용 조작)

내용 참조
https://dev.iasdf.com/wiki/manual/bash#%EB%B2%88%EC%99%B8-sed-%EC%82%AC%EC%9A%A9%EB%B2%95

test (파일의 상태 확인)


심화 명령

계정에 sudo 권한 주기

1
usermod -aG sudo <계정명>

split 명령어 간단 사용법

1
2
3
split <파일명>

split <파일명> <분할할 파일명>

아무 옵션 없이, 분할할 파일명을 기입하지 않고 실행하면 1000줄씩 파일을 나누고 파일 이름은 xaa, xab, xac… 형식의 영문 2자리가 추가되어 구분된다.

분할할 파일명을 기입할 경우 <분할할 파일명>aa, <분할할 파일명>ab, <분할할 파일명>ac… 형식으로 파일이 생성된다.

옵션
  • -l : 라인수 기준으로 파일을 분할
    • split -l 100000 logtest.log logtest_
  • --additional-suffix : 분할된 파일명에 추가할 문자열
    • split --additional-suffix=.log logtest.log logtest_
  • -d : 알파벳 대신 숫자를 사용하여 분할된 파일명을 구분
    • split -d logtest.log logtest_

내가 자주 사용하는 split 옵션은 다음과 같다.

100만줄 이상의 대용량 로그 파일의 경우 5~10만줄 단위로 끊어서 분석하기 위해 사용한다.

1
split -l 100000 --additional-suffix=.log logtest.log splogtest

분할을 진행했을 경우 grep을 통해 검색을 진행한다.

1
grep -n "검색어" splogtest*.log

timezone을 KST (한국)으로 설정

설정 가능한 timezone 검색

1
2
timedatectl list-timezones | grep Seoul
결과 : Asia/Seoul

적용

1
sudo timedatectl set-timezone Asia/Seoul

대용량 파일 또는 특정 용량 파일 생성

  1. fallocate 사용
1
2
3
4
5
# 100 byte 크기의 test.txt 파일을 생성한다.
fallocate -l 100 test.txt

# 10G 크기의 test.txt 파일을 생성한다
fallocate -l 10G test.txt
  1. dd 사용 (dd의 경우 디스크 성능측정 및 IO 테스트 명령어로도 쓰임)
1
2
3
4
5
6
dd if=/dev/zero of=파일명 bs=1 count=0 seek=크기

# 변수1 * 변수2 바이트의 파일이 생성된다.
# 변수2(buffer size)의 크기를 변수 1(count)번 만큼 생성한다.
dd if=/dev/zero of=파일명 count=변수1 bs=변수2

파일명 일괄 변경

find와 sed를 이용하여 파일명을 일괄 변경할 수 있다.

파일명에 0000-00-00- 문자열이 포함되어 있다면 0001-01-01- 문자열로 변경한다.

1
find ./ -name "*0000-00-00-*"  | sed -e 'p' -e "s/0000-00-00-/0001-01-01-/g" |xargs -n 2 mv

현재 경로의 모든 파일에서 공백의 문자열을 _로 변경한다.

1
find ./ -name "*" -type f | sed -e 'p' -e "s/ /_/g" | xargs -d '\n' -n 2 mv
1
2
find ./ -name "*" -type f | sed -e 'p' -e "s/Complete_Mono/CM/g" | xargs -d '\n' -n 2 mv
find ./ -name "*" -type f | sed -e 'p' -e "s/_Windows_Compatible/WC/g" | xargs -d '\n' -n 2 mv

특정 확장자의 내용 일괄 변경

md 확장자를 가진 파일에서 foo 문자열을 모두 bar로 변경한다.

1
find . -name "*.md" -type f -exec sed -i'' -e "s/foo/bar/g" {} \;

.js 확장자를 가진 파일에서 /" 문자열을 " 로 변경한다. (첫 번째로 매칭되는 문자만 변경한다. sed에 g 옵션이 없기 때문)

1
find . -name "*.js" -type f -exec sed -i'' -e "s#/\"#\"#" {} \;

파일시스템 전체 or 디렉토리 트리 구조를 동일하게 복사

1
find . -depth -print | cpio -pmdvl /path/to/dest/

파일 크기 0으로 만들기

아래 3개의 방법 중 택 1

1
cp -f /dev/null /path/to/file
1
cat /dev/null > /path/to/file
1
echo -n "" > /path/to/file

gzip 압축된 텍스트 검색

zgrep 을 이용하자.
gzip 압축을 풀지 않고도 텍스트를 검색할 수 있다.

파일을 제외하고 디렉토리 이름만 보기

1
ls -la | grep --color=never "^d"

리눅스 로그아웃 시 백그라운드로 프로세스 계속 실행시키기

nohup을 이용하면 된다.

1
2
nohup <command> &
nohup ./req.sh &

grep 매치되지 않은 결과를 보고 싶을 때

1
grep -v "패턴"

more, less 상태에서 편집하기

more <filename> 상태에서 v 키를 누르면 vi로 해당 파일 편집 가능

cat <filename> | more 로 진행할 경우 작동 X

프로그램 실행시간 체크

1
2
3
4
time <명령어>
# example
time ./req.sh
time make all

내 시스템이 다른곳에서의 ping에 응답하지 않게 하려면?

1
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

다시 응답하게 할때는

1
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all

명령어 출처 - KLDP 한국리눅스커뮤니티 문서 참조

This post is licensed under CC BY 4.0 by the author.