Linux os를 사용하면서 자주 사용하는 명령어를 정리해보자.
생각나는 데로 정리하고 있는데, 필요할 때마다 내용을 추가할 예정이다.
중괄호 [] 안에는 사용 가능한 option이 있고, <> 안에는 input이 들어간다.
아래에는 추가적으로 설명을 달았다.
cat /etc/*release*

아래는 최상위 디렉토리 '/'위치에서 본 tree 구조이다.

다양한 디렉토리가 있는데, 기본적으로 linux를 구성하는 디렉토리에 대해 알아보자.
(1) / (root directory)
(2) /bin
(3) /boot
(4) /dev
(5) /etc
(6) /home
(7) /lib
(8) /media
(9) /mnt
(10) /opt
(11) /proc
(12) /root
(13) /sys
(14) /usr
다른 것들도 몇 개 있긴 하지만, 내가 한번도 안건들여본 위치는 안적었다.
user의 정보 확인
id <userID>
root의 권한을 사용 (사용자마다 부여받은 권한이 다름)
/etc/sudoers에 미리 설정된 user만 사용 가능하다.
sudo <commend>
사용자를 변경
su [- -l] <userName>
-l : login
userName : 적지않으면 root 계정
내 컴퓨터에 사용자 추가하거나 삭제 (sudo를 같이 사용)
sudo adduser <userName>
sudo deluser <userName>

새로 만든 사용자는 sudo 권한이 없으므로 부여해줘야 한다.
sudo usermod -a -G sudo <userName>
-a -G : 둘이 같이 쓰이며, 다른 그룹에 속하게 한다


마찬가지로 sudo 권한 설정을 위한 명령어로 vi편집기 이용
sudo visudo -f /etc/sudoers
[userName] ALL=(ALL:ALL) ALL을 입력해주고 저장 (ctrl+x -> y)

유저 비밀번호 변경
sudo passwd <userName>
/etc/passwd에 들어가보면 시스템에 등록된 사용자 정보를 볼 수 있음

UserName:passwd:UserID:GroupID:UserIDInfo:HomeDirectory:CommandShell
현재 사용자가 명령어를 입력하고 있는 경로를 출력
현재 위치의 디렉토리에 파일과 디렉토리 출력
ls [-a -l]
-l : 상세 정보 출력
-a : 숨김 파일까지 출력
원하는 경로로 이동
cd <path>
cd .. : 이전 디렉토리
cd / : 최상위 디렉토리
mkdir [-p -m] <dirName>
-m 777 : 특정 권한 (777)의 디렉토리 생성
-p dirName/sub_dirName : sub directory까지 한번에 생성
rm [-r -f] <fileName / dirName>
-r : 디렉토리와 내부 모든 파일 삭제
-f : force 삭제 + 확인 메세지 출력 안함
파일/폴더 이름 변경 및 파일 이동에 사용 (1 -> 2)
mv [-r -f] <fileName1 / dirName1> <fileName2 / dirName2>
-f : 강제 이동, 이미 파일이 있으면 덮어씌우기
파일/폴더 복사 (1 -> 2)
cp [-r -f] <fileName1 / dirName1> <fileName2 / dirName2>
-r : 디렉토리 복사
-f : 강제 복사, 이미 파일이 있으면 덮어씌우기
특정 경로에서 파일을 검색
find <path> <expression>
path : 어떤 디렉토리에서부터 파일을 찾을 것인지
expression : 찾는 파일의 대상 범위를 정함 -name / -type 등을 사용

내 컴퓨터에서 특정 파일을 검색
locate <file>
로컬에서 외부로 파일을 전송
ssh 원격 접속 프로토콜 기반 securecopy
scp [-r -p -P] <fileName> <remoteName>@<remoteIP>:<Destination(Remote)>
-r: 디렉토리를 전송
-p: 원본 권한을 그대로 유지하여 복사
-P: 포트 지정 가능
-> 보통 scp -P <port> -rp <directory> <remoteName>@<remoteIP>:<receiving location>로 많이 옮김
외부에서 로컬로 파일/디렉토리를 받아올 수도 있음
scp [-r -p -P] <remoteName>@<remoteIP>:<Source(Remote)> <Destination(Local)>
Tape ARchiver -> 묶음 형태를 제공
tar [-c -x -v -z -f] <fileName.tar> <targetDirectory/File>
-f: 대상 archive를 지정 (default)
-c: tar archive를 생성
-x: tar archive에서 파일 추출
-v: archiving하는 파일 정보 나열
-z: gzip 압축 (archive를 압축)
tar -zcvf <fileName.tar.gz> <targetDirectory/File>
압축 해제
tar -xf <fileName.tar.gz>
옵션 없이 사용할 경우 파일의 atime/ctime/mtime을 현재 시간으로 변경
0 byte의 빈 파일을 생성
touch [-a -d -m -r -t] <fileName>
옵션은 어떤 시간을 변경할 것인지에 대한 것들
stat <fileName> 으로 파일의 시간을 볼 수도 있다.

리눅스의 파일 편집기
vim <fileName>으로 편집기를 킬 수 있다. (파일이 없으면 생성되면서 열림)
처음에 들어가면 명령 모드
i : 입력모드로 전환 (현재 커서부터 입력)
esc : 명령모드로 나옴
/<word>: 명령 모드에서 찾는 word를 '/'뒤에 치고 엔터 누르면 찾을 수 있다. 'n'으로 다음 찾기
:q : vim 종료
:q! : 강제 종료
:wq : 저장후 종료
cat <fileName>

head [-n] <fileName>
tail [-n -f] <fileName>
-n : 몇 줄 출력할지
-f : 내용 변경될 때마다 실시간 출력

grep <pattern> <fileName>
파이프(|)를 이용하여 다른 명령어와 조합해서 자주 사용
<command> | grep [-v] <pattern> <fileName>
-v: pattern을 제와하고
'^pattern': pattern이 맨 앞에 오는 경우
'pattern$': pattern이 맨 뒤에 오는 경우

word count
wc [-c -l -m -w] <fileName>
-c: 문자
-l: 행
-w: 단어
파이프(|)를 이용하여 다른 명령어와 조합해서 자주 사용
ls | wc -l: 현 위치 파일 갯수를 세어줌

top 명령어가 있지만 htop이 훨씬 보기 좋다.
= No hang up
무언가를 터미널과 같은 세션 종료 후에도 계속 돌리고 싶을 때.
nohup <command>
아래와 같은 test python script가 있다고 해보자.


nohup을 python command 앞에 감싸주면, ps -ef |grep python으로 확인해 볼 수 있다.

그런데, 이때 nohup은 nohup.out과 같은 표준 출력을 만들어내는데, redirection을 이용하여 원하는대로 입/출력 할 수 있다.
nohup <command> [> >> <] <fileName>
>: 기존에 있는 파일 내용 지우고 저장
>>: 계속 덧붙여서 저장
<: 파일의 데이터를 command에 입력
예를 들어 nohup python test.py 1 >> test.out이라고 쓰면 계속 숫자가 test.out이라는 텍스트 파일에 써질 것이다.
만약에 아무것도 출력하기 싫다면 nohup <command> > /dev/null처럼 쓰면 된다.
추가적으로 &를 붙여서 프로그램을 백그라운드에서 돌게 할 수 있다.
즉 nohup <command> > /dev/null &를 사용하면 해당 command가 백그라운드에서 실행되고, 로그아웃을 하거나 세션이 끊기게 되도 프로세스가 멈추지 않는다.
강제종료하고 싶다면 위 처럼 프로세스를 검색해서 kill 해주면 된다
kill -9 27880
free [-h]

혹은 cat /proc/meminfo를 통해 자세한 메모리 사용 정보 확인 가능
echo 3 > /proc/sys/vm/drop_caches
PageCache, dentries 와 inodes 모두 해제.
swapoff -a && swapon -a
Linux system 전체 disk 공간 및 사용량 확인 (disk free)
mount한 디스크도 확인 가능
df [-h]
-h: human이 읽기 좋은 단위로 출력
특정 디렉토리나 파일의 크기 확인 (disk usage)
du [-h -s -a]
-h: human이 읽기 좋은 단위로 출력
-s: 하위 directory 표시 없이 전체 용량을 표시
-a: 하위 directory의 파일까지 함께 표시
HARD 드라이브부터 USB 드라이브까지 모두 확인해서 나열
장치 이름, 장치 번호, 크기, 마운트 지점 등의 정보를 확인할 수 있음
lsblk

새로운 하드디스크를 연결했을 때, 이를 인식하고 사용하기 위함
lsblk나 fdisk -l로 하드디스크를 확인한다.
보통 ubuntu main disk는 'sda'로 되어있고, 그 이후로 'sdb', 'sdc'로 인식
마운트를 하려는 폴더를 하나 생성하고,
sudo mount <FileSystem> <Mount location>
예를 들어 mount /dev/sda1 /data
매번 mount할 수 없으므로, '/etc/fstab' 수정해서 자동 마운트 설정
vim /etc/fstab
UUID를 통해 file system을 표현할 수도 있고, LABEL로 표현할 수도 있다.
리눅스에서는 각 파일 및 디렉토리에 대해 개별적으로 권한을 부여할 수 있다.
권한은 read/write/execute로 구성되어 있고, 이를 user/group/others에 대해 또 따로 지정할 수 있게 되어있다.
먼저 command에서 ls -l을 사용해 현재 위치에서 파일 및 디렉토리의 권한을 확인할 수 있다.

Permission:physically connected files:User Ownership:Group Ownership:FileSize:ModifiedTime:FileName
여기서 첫번째에 권한 정보가 나와있다.
- | rwx | rwx | rwx-는 파일의 타입을 의미하고, 그 뒤로 user의 권한 / group의 권한 / 그 외 사용자의 권한이 표현된다.
chmod는 이러한 권한을 변경하는 명령어이다.
chmod [u/g/o/a +/-/= r/w/x] <FileName>
u/g/o/a: user/group/others/all에 대해
+/-/=: 권한을 추가/제거/지정
r/w/x: read/write/execute할 수 있는
chmod에서는 각 소유자 별 권한을 8진수로 해서 한번에 지정하기도 한다. (rwx=111=7)
chmod [-R] 777 <DirectoryName/FileName> -> 모든 소유자에게 모든 권한을 부여
-R: 디렉토리에 대한 권한 변경할 때, 하위 파일 및 디렉토리에 대해 모두 적용
Network controller나 USB controller와 같은 주변 장치 종류와 정보 확인
lspci [-v]
-v: 각 장치의 정보 표시
v4l2-ctl --list-devices # 연결된 디바이스 확인
v4l2-ctl -d /dev/video0 --list-formats-ext # 디바이스 번호로 카메라 정보 확인
v412-ctl 설치는 sudo apt-get install v4l-utils -y
Memory, firmware, cpu, network 등의 정보를 출력
lshw [-C] <ClassName>
-C: classname과 함께 사용하면 원하는 하드웨어 정보만 출력 가능.
lsmod: 시스템 설치된 모듈 리스트
modinfo <ModuleName>: 특정 모듈의 정보 확인
modprobe <ModuleName>: 특정 모듈을 추가
<환경변수명>=<변수>export <환경변수명>=<변수>unset <환경변수명>
echo $<환경변수명>
local variable 전체 확인 set
global variable 전체 확인 env
'/etc/bash.bashrc'에 export <환경변수명>=<변수> 기입 (모든 사용자)
'/home/USER/.bashrc'에 export <환경변수명>=<변수> 기입 (특정 사용자)
추가로, bashrc와 같은 script 파일을 즉시 실행시키려면 source 사용하면 된다.
source .bashrc
$PATH 환경변수는 실행 파일을 찾을 수 있는 위치를 알려주는 변수
env | grep PATH / echo $PATH 등으로 확인 가능
find . | grep -E "(__pycache__|\.pyo$)" | xargs rm -rf