유닉스 명령어_디렉토리관리,파일관리,파일권한관리,패턴검색,파일검색 Enjoy/etc2010. 3. 27. 04:45
출처 : http://blog.naver.com/jungah26/130041519053
1 디렉토리 관리
1) 디렉토리(파일)정보 출력(ls)
① ls [-ailFR] [file-name | directory_name]
–-l : 목록형태로 정보 자세히 보여줌
–-a : 도트(.)파일(숨겨진 파일) 포함하여 디렉토리 내에 있는 모든 디렉토리 및 파일을 보여줌
–-R : 하위 디렉토리에 있는 내용까지 보여줌
–-F : 디렉토리인지나 어떤 종류의 파일인지를 알려줌(/디렉토리, *실행파일, @심볼릭링크)
–-i : 디렉토리 및 파일에 지정된 inode 번호를 보여줌
② 종류, 접근권한, 하드링크수, 소유주, 소유그룹, 크기, 최종변경일, 최종변경시간, 이름
- _rwxrwxrwx 1 root root 4061 4월13 17:59 daemon
- 종류 : 첫 번째 바이트 문자, 디렉토리 및 파일의 종류, d(디렉토리), b(블록디바이스(커널내의 특정버퍼 이용)파일), c(문자디바이스(문자단위로 처리)파일,), l(심볼릭링크파일(특정파일의 위치정보를 담고 있는 파일)), p(네임드파이프), s(유닉스도메인), -(일반(정규)파일, 텍스트파일 또는 실행 프로그램)
- ※참고 : 디바이스파일 – 물리적인 입출력 장치들을 참조하는 파일
- 접근권한 : 두 번째 바이트 문자부터 세 개씩 user, group, other
- user : 파일을 만든 소유주
- group : 파일을 만든 소유주가 속한 그룹의 사용자
- other : 기타 사용자
- r(4) : 읽기 권한과 디렉토리 내에 있는 파일명을 읽을 수 있는 권한
- w(2) : 쓰기 권한과 디렉토리 내에 파일을 생성, 삭제할 수 있는 권한
- x(1) : 실행 권한과 디렉토리 내에서 탐색을 위해 이동할 수 있는 권한
- - : r, w, x에 대한 권한이 없는 경우 해당 자리를 대체
- 유닉스의 경우 일반 파일 생성의 경우 666(rw_rw_rw_), 디렉토리 생성의 경우 777(rwxrwxrwx)을 디폴트 값으로 취하고 umask로 지정한 값만큼 디폴트 값에서 뺀다.
- 하드 링크 수 : 링크 카운터, 동일한 inode를 참조하는 파일의 수
- 소유주 : 해당 디렉토리 및 파일의 소유주
- 소유 그룹 : 소유주가 소속된 기본 그룹명
2) 디렉토리 간의 이동(cd : change working directory) : 파일 시스템 내의 특정 디렉토리로 이동할 때 사용
① cd / : 루트 디렉토리로 이동
② cd .. : 상위 디렉토리로 이동
③ cd ~ 또는 cd : 사용자의 홈 디렉토리로 이동
④ cd /etc : /etc 디렉토리로 이동
⑤ cd ./a/b : 현재 디렉토리 하위의 /a/b 디렉토리로 이동
⑥ 절대 경로명 : 루트 디렉토리를 기준으로 기술(/home/freeman/work/project)
⑦ 상대 경로명 : 현재 디렉토리를 기준으로 기술(./work/project)
⑧ 특수 디렉토리 : . - 현재 디렉토리, .. - 상위 디렉토리, ~ - 홈 디렉토리
3) 현재 디렉토리 확인(pwd : print working deriectory) : 현재 디렉토리의 절대 경로명을 출력
4) 새 디렉토리 생성(mkdir) : 디렉토리를 새로 만들면 . 와 .. 이 자동으로 생성된다. 이 두 디렉토리는 사용자가 임의로 생성할 수 없다.
① mkdir [-m mode] [-p] directory_name
–-m : 새로 만들 디렉토리의 접근 권한을 명시적으로 선언, 없는 경우 디폴트 접근 권한인 777이 적용됨(umask적용 받음)
–-p : 계층적인 구조를 갖는 디렉토리를 한꺼번에 만듬.
② –-p옵션과 함께 -m옵션이 사용되는 경우에 명시적인 접근 권한은 최하위 디렉토리에만 적용된다.
③ mkdir –-p work/project
5) 기존 디렉토리 삭제(rmdir)
① 하위에 디렉토리나 파일이 없어야 한다.
② –-p : 계층적인 구조 갖는 디렉토리를 한꺼번에 삭제
2 파일 관리
1) 파일 보기
① cat : concatenate
- 파일의 내용을 화면에 출력, 짧은 내용을 보는 경우에 사용하는 것이 좋다.
- 편집기로도 사용 가능하지만 불편하다.(편집기 사용 중 중단은 [Ctrl+d])
- 출력 재지정 명령(>, >>)과 함께 사용해 파일 생성, 확장(덧붙이기), 분리된 파일들을 임의의 파일로 병합할 때 사용한다.
- cat [-nb] file_name
- -n : 라인 번호를 붙여서 파일을 출력
- -b : 공백 라인을 제외하고 라인 번호를 출력
- cat > a.txt : 입력하는 텍스트를 출력 재지정하여 a.txt파일에 저장
- cat a.txt b.txt > c.txt : a.txt와 b.txt파일 내용이 c.txt파일에 순차적으로 출력
- cat hello.txt >> all.txt : hello.txt파일의 내용이 all.txt파일 뒤에 덧붙여짐.
② more : 파일 전체 내용을 화면의 크기에 맞게 끊어서 보여줌
- more [-d] [+line_number] [-line] [+/pattern] file_name
- -d : 좀 더 자세한 프롬프트를 보여줌
- +line_number : 숫자에 해당하는 라인부터 출력
- -line : 숫자 라인 만큼씩 스크롤하여 보여줌
- +/pattern : 지정 패턴이 있는 곳부터 출력
- h : 도움말 출력, q : 종료, = : 현재 라인번호, [Ctrl+i] : 화면에 재출력
- :f : 파일명과 라인번호 출력, v : 현재 라인에서 vi시작, space : 다음 화면 보여줌
- 숫자[return] : 숫자만큼 다음 라인 출력
③ head : 파일의 첫 번째 줄부터 10번째 줄까지를 디폴트로 보여줌
-number : 숫자만큼의 라인을 출력
④ tail : 파일의 끝으로부터 10번째 줄까지를 디폴트로 보여줌
-number : 파일의 끝으로부터 지정한 숫자만큼 출력
+number : 처음부터 지정한 숫자만큼 띈 라인부터 파일 끝까지 출력
-f : 파일에 추가되는 내용을 실시간으로 확인하는 것이 가능
2) 파일 이동(mv) : 하나 또는 여러 파일이나 디렉토리를 다른 곳으로 이동
① 목적지 지정하면서 다른 이름으로 변경 가능(기존에 있으면 덮어쓴다)
② mv a.c b.c : 이름 변경(a.c -> b.c)
mv a.c b.c .. : 상위폴더로 a.c와 b.c를 이동
mv a.c b.c ./work : /work폴더로 이동
mv -i a.c b.c : 덮어쓸지 물어봄
3) 파일 복사(cp)
① -i : 대상 파일이 있는 경우 덮어쓸 것인지를 대화식으로 묻는다.
② cp a.c b.c : a.c내용을 b.c에 복사
③ cp a.c b.c c.c ./Backup/ : 세 개의 파일이 Backup디렉토리로 복사
④ cp *.c ./Backup/ : 확장자가 .c인 모든 파일을 Backup디렉토리로 복사
4) 파일 삭제(rm) : 하위 디렉토리와 그 안에 있는 파일 모두 삭제됨. 기본적으로 복구 안됨.
① -i : 확인 문구
② -r : 디렉토리 삭제시 사용, 디렉토리 비어있지 않아도 삭제
③ -f : rm에 설정된 -i옵션을 제거함.
④ rm -r A
rm -i *.c
alias rm=’rm -i’: 명령어 rm이 rm -i로 대치되도록 alias로 처리
rm main.c : rm이 rm -i로 대치되어서 삭제 여부를 확인한다.
rm -f main.c : alias처리된 기능을 제거(unalias)
5) 파일 링크(ln)
① 하드 링크(Hard Link) : 이름이 다른 파일에 동일한 inode를 지정해주는 것, 다른 파일 시스템 간에는 만들 수 없다. 이름을 제외한 모든 속성이 같고 링크된 파일의 속성을 바꾸면 다른 파일의 속성이 함께 바뀐다.(파일에만 링크 가능)
② 심볼릭 링크(Symbolic Link) : 원래 파일의 경로정보를 담고 있다. 그 내용을 참조해 원래 파일에 접근한다. c의 포인터와 비슷한 개념이다. 다른 파일 시스템 간에 존재하는 파일이나 디렉토리 간에도 가능하다.(파일 또는 디렉토리에 링크 가능)
③ ln [-s] source_file | source_derectory target_file
–-s : 있으면 심볼릭 링크, 없으면 하드 링크
④ ln -s a.c b.c -> ls -il -> 화면에 b.c -> a.c 이렇게 출력됨.
⑤ 링크 카운터(Link Counter) : 동일한 inode를 참조하는 파일의 개수
ls -l
총 2
-rx-r—r-- 1 root root …… : 여기서 1이 링크 카운터이다.
3 파일 권한 관리
1) 접근 권한 변경(chmod) : 해당 파일 소유주나 root만 실행
① -R : 하위 디렉토리와 파일의 권한까지 변경
② permission : 기호나 8진수로 접근 권한 지정
③ 접근 권한을 기호로 기술하는 방법
대상 : u(user), g(group), o(other), a(all)
연산자 : +(추가), -(제거), =(지정)
접근권한 : r, w, x
④ 접근 권한을 숫자로 기술하는 방법(세 개의 8진수로)
r : 4, w : 2, x : 1
⑤ chmod 777 a.c
chmod g-x a.c
chmod a=rwx a.c
2) 소유권 또는 그룹 변경(chown / chgrp)
① -R : 하위 디렉토리와 모든 파일의 소유주 변경
② -h : 심볼릭 링크 파일 자체의 소유주나 그룹 변경
③ 보안 위해 수퍼 유저만 실행할 수 있도록 명령에 제한 두는 경우가 많음.
④ chown root a.c : a.c파일의 소유주를 root로 변경
⑤ chgrp system a.c : a.c파일의 소유그룹을 system으로 변경
3) 접근 시간 변경(touch)
① 인수로 오는 파일의 존재 여부에 따라 파일이나 디렉토리의 시간 정보를 변경하거나 신규파일 생성
② touch [-acm] [-t[[CC]YY]MMDDhhmm] [-r file_name] file_name | directory_name
touch [-acm] [MMDDhhmm[YY]] file_name
-c : 대상 파일의 시간만 변경할 경우, 대상 파일이 없으면 파일 만들지 않는다.
-a : 마지막 접근 시간만 변경
-m : 마지막 수정 시간만 변경
-r : 옵션 뒤에 지정한 파일의 시간으로 대상 파일의 시간 변경
-t : 현재 시간 대신 파일의 시간을 지정한 시간으로 변경
③ touch main.c : main.c파일이 없을 경우 명령 후 생성됨
4) 접근 권한 마스크(umask) : 앞으로 만들어진 파일에 영향을 미친다.
① 명령시 지정한 8진수는 새로 만들어질 파일이 갖지 말아야 할 권한을 명시한다. 보통022를 많이 사용한다.
② 일반적으로 파일은 666 - umask값, 디렉토리는 777 - umask값
4 파일 응용
1) 파일 내 문자 개수(wc : word count)
① wc [-cmlw] 파일명1 [파일명2…]
-l : 라인 수, -w : 단어 수, -c : 바이트 수, -m : 문자 수
② 한글의 경우 한 문자는 2바이트로 구성
③ 옵션이 없는 경우 : -l, -w, -c 순으로 출력
④ 여러 파일 나열할 경우 합계도 출력
2) 파일 가공(cut)
① 파일의 각 행으로부터 특정 바이트나 필드를 추출해내는 명령
② cut [-옵션] 파일명
-c 뒤에 해당 바이트수 : 바이트 단위의 행을 출력
–-f 뒤에 해당 필드 : 필드 단위의 행을 출력
–-d 뒤에 특정 구분자 : 특정 구분자를 표기함, -f옵션과만 사용 가능
③ -c와 -f는 함께 사용할 수 없다.
④ cut -c4 a.txt : 각 행의 4번째 바이트를 출력
cut -c1-4 : 각 행의 1에서 4번째 바이트까지 출력
⑤ 불필요한 필드를 삭제한 문서의 행들을 출력하는데 효과적, 출력 재지정을 이용해서 파일 저장이 가능
3) 파일 가공(paste)
① cut와 반대로 행을 병합, 여러 개의 파일에서 같은 행을, 한 파일에서 인접한 같은 행을 병합
–-s : 한 파일 내에서 인접한 행을 병합
–-d 구분자들 : 구분자를 지정, -d:, -d”:@”, -d”\t\t\n”(- - -와 같다)
② paste -d: a.txt b.txt : a.txt와 b.txt내용을 :로 구분해서 합해서 출력
(a.txt 내용 1 , b.txt 내용 a => 1:a 로 출력)
ls | paste - - -와 ls | paste -d”\t\t\n” -s 는 같은 의미
4) 파일 내 문자 치환(tr)
① 지정한 문자를 치환, 삭제, 줄일 때
② tr [-옵션] string1 [string2]
–-d : string1에 나오는 문자와 일치하는 모든 입력 문자를 삭제
–-s : string1에 나오는 문자 중 같은 문자들의 반복을 하나의 문자로 줄임.
③ 옵션이 없을 경우 : string1을 string2로 바꾼다.
④ tr ‘0aA’ ‘@#$’ < data1.txt : 0->@, a->#, A->$로 치환
more data1.txt | tr -d ‘0aA’ > data.txt : 0, a, A 제거하고 출력
tr -s ‘abcd’ < data3.txt : a, b, c, d 중 반복되는거 있으면 한 문자로 줄임(aaa->a)
5) 파일 정렬(sort)
① 지정한 파일의 내용을 알파벳 순이나 숫자 순으로 출력하거나 정렬된 파일의 내용 병합
② sort [-옵션] [-o output_file] file_name1 [file_name2…]
–-n : 라인의 각 필드를 비교하는 대상을 숫자로 한정
–-d : 사전 순으로 정렬(영어, 숫자만)
–-f : 대소문자 구분 없이 비교
–-r : 역순 출력
–-b : 앞에 붙는 공백 무시
–-t : 필드 구분하는 구분자를 지정
–-m : 이미 정렬된 파일 병합
–-u : 파일 정렬하고 중복되는 행을 하나의 행으로 만듬.
-o : 출력 결과 저장할 파일의 이름 적음. 파일명을 적지 않으면 화면에 출력
③ 옵션 없을 경우 : ASCII코드 순으로 정렬
④ 공백을 구분자로 필드를 나누고 왼쪽부터 우선 정렬, 첫 필드가 0
⑤ +숫자 : 해당 번째의 필드부터 정렬함
⑥ sort +2 a.txt : 공백 포함되어 있으면 정상적으로 나오지 않을 수 있다.
sort +2b a.txt : 공백 무시
sort +3n sort_data1.txt –o out.txt : 네번째 필드를 숫자(n)로 인식해 정렬해서 out.txt에 결과 출력
cut -f1,3 -d: /etc/passwd | sort +1n -t: : 1,3번째 필드, : 구분자, 2번째 필드를 숫자로 인식해 정렬, : 기준으로 필드를 구분함.
6) 파일 분할(split)
① 하나의 파일을 여러 개의 작은 파일로 나눌 때 사용
② 명시한 접두사에 aa~zz까지 어미가 붙는 형태로 디폴트 값은 x이다(xaa, xab, xac…)
③ split [-line_number | -l line_number] target_file [prefix]
-line_number | -l 나누고자 하는 라인 단위의 수(디폴트 1000줄)
④ split -10 a.txt : xaa, xab, xac…
split -10 a.txt cho : choaa, choab, choac…
7) 파일 내 인접행 비교(uniq)
① 파일에서 인접하는 행을 비교하여 같은 내용이 여러 번 반복되면 한 행만 출력(이어진 문장에 대해서만 검사)
② uniq [-옵션] input_file [output_file]
–-u : 반복되지 않은 행만 출력
–-d : 반복되는 행만 출력
–-c : 각 행별 반복 개수를 추가로 알려줌
③ output_file : 처리된 결과 저장
④ uniq -u main.c
8) 파일 비교(cmp)
① 두 개의 파일 비교하여 다르다면 처음 발견한 라인 번호와 바이트 옵셋(offset)을 화면에 출력, 같으면 아무것도 출력 안함
② cmp [-l | -s] 파일명1 | 파일명2
–-l : 서로 다른 모든 바이트 옵셋의 위치와 각 파일의 문자 값 출력
–-s : 두 파일을 비교한 결과 값만을 반환(0 : 일치, 1 : 다름, 2 : 파일 접근 불가)
9) 파일 비교(comm)
① 두 파일을 비교해 한쪽에만 있거나 양쪽 모두에 있는 행을 찾아낸다.
② comm [-123] 파일명1 파일명2
-12 : 두 파일에 공통으로 있는 행 출력
-13 : 파일2에는 있고 파일1에는 없는 행 출력
-23 : 파일1에는 있고 파일2에는 없는 행 출력
③ 옵션 없을 경우 : 세 개의 의미 다 포함(-12, -23, -13)
④ 프로그램이나 라이브러리가 변경되는 경우 이전과 최근 목록 비교해 정리하는데 유용함
10) 파일 비교(diff)
① 파일이 동일한지 여부 검사
② diff [-ib] 파일명1 파일명2
③ -i : 대소문자 구별 안함
④ -b : 하나 이상의 공백 문자는 모두 동일 취급
⑤ diff a.txt b.txt : a.txt를 기준으로 b.txt와의 차이점 비교
[출력]5c5,6 : a.txt의 5라인과 b.txt의 5~6 라인이 다르다.
< five : a.txt에만 있는 내용
---
> six : b.txt에만 있는 내용
> seven : b.txt에만 있는 내용
⑥ 파일명1을 기준으로 같아지기 위해서는
n1 a n3,4 : 파일명1의 n1라인에는 없지만 파일명2의 n3-4라인에는 있다. append
n1,n2 c n3,n4 : 파일명1의 n1-2라인과 파일명2의 n3-4라인이 서로 다르다. change
n1,n2 d n3,n4 : 파일명1의 n1-2라인에는 있지만 파일명2의 n3-4라인에는 없다. delete
11) 패턴 검색(grep)
① 파일 내에서 지정한 패턴이나 문자열 찾은 후 그 패턴을 포함하고 있는 모든 행을 표준 출력
② grep [-civnlw] pattern 파일명1 [파일명2…]
–-c : 패턴 일치 행의 수
–-i : 대소문자 구별 없이 비교
–-v : 패턴과 일치하지 않은 행만 출력
–-n : 행의 번호 함께 출력
–-l : 패턴 포함된 파일명 출력
–-w : 패턴이 전체 단어와 일치하는 행만 출력
③ 정규표현식 : 문자, 숫자, 특수문자($, ^, *, . 등)로 구성, 작은따옴표(‘’)로 묶음.
④ ‘^abc’ a.txt : ^(행의 시작), abc로 시작하는 행을 찾는다.
‘abc$’ a.txt : $(행의 끝)
‘abc*’ a.txt : abc로 시작하는 단어 모두
‘a.....g’a.txt : a로 시작 g로 끝나는 7자리 단어
[a-d] a.txt : a, b, c, d로 시작하는 단어 모두
[fF]ree a.txt : free 또는 Free로 시작하는 단어 모두
⑤ egrep : grep의 확장, 다수의 패턴을 하나 혹은 다수의 파일에서 찾는다. 대체 패턴은|로 분리 지정, 파이프로 인식하지 않게 하기 위해 인용부호(‘’)로 묶는다.
egrep ‘Sunny, [one|Thank]’ a.txt
12) 파일 검색(find)
① 시스템 내에 있는 파일들 중 사용자가 원하는 파일 찾을 때 사용, 찾은 파일에 특정 명령을 실행하도록 명령할 수 있어 편리, 검색경로는 절대경로나 상대경로 사용
② find path [expression] [action]
-name file_name : 검색 대상 파일명, [], ?, *의 메타문자 함께 사용 가능
-type [file_type] : 검색 대상 파일의 종류 지정, b(block), c(character), d(directory), p(Named Pipe), f(Regular File), l(Symbolic Link), s(socket)
-user uname : uname은 검색 파일의 소유주 또는 UID
-group gname : gname은 검색 파일의 소유그룹 또는 GID
-size [+-]num[bck] : 검색 파일의 크기 지정, num(일치), +num(이상), -num(이하)
b(block, 512byte, 디폴트), c(byte), k(kilobyte)
-perm mode : 8진수로 주어진 접근 권한 갖는 파일 검색
-atime [+-]n : 파일이 읽힌 최근 시간
-ctime [+-]n : 소유주나 권한이 바뀐 최근 시간
-mtime [+-]n : 파일이 수정된 최근 시간
-prune : 서브로 내려가지 않고 현재 디렉토리에서만 검색
-print : 검색 후에 행할 작업 옵션으로 검색 결과 출력
③ -exec command {} \; : 검색 후에 행할 작업 옵션으로 검색 결과에 특정 명령 실행하게 명령함.
{}를 명령어의 인수를 사용하면 find명령이 찾은 파일명으로 치환함. ;로 종료되어야 함. 쉘은 ;를 특수문자로 인식하기 때문에 \와 함게 쓰임. }와 \사이에 공백이 있어야 함.
find . -name “*.c” -exec rm {} \; : *.c를 검색해서 그 결과를 rm명령어의 인수로 전달해 실행함.
④ 명시적으로 논리 연산 사용하는 것이 가능 : -a(AND), -o(OR), !(NOT)
(expression)
! expression
expression [-a] expression : 디폴트 연산자
expression -o expression
find . -name “*.log” -o -name “*.o” -print : 확장자가 둘 중 하나인 것
find . \(-name “*.log” -o -name “*.o”\) -print : 위와 동일
find . !\(-name “*.log” -o -name “*.o”\) -print : 이외의 것 검색
find . \(-name “*.log” -o -name “*.o”\) -exec rm {} \; : 찾아서 삭제
⑤ xargs 명령어 : 파이프로 넘어오는 결과를 읽어들여 뒤에 오는 명령어에게 다중 인수로 변환하여 전달
find . | xargs 명령어 : find의 결과가 명령어의 다중 인수로 받아들여짐.
⑥ 예
find . : find . -print와 동일(-print가 디폴트로 설정), 현재와 서브 디렉토리의 모든 파일 출력
find . -name “*.c” -print : .c로 끝나는 파일
find . -type d -print : 디렉토리만
find . -name lib -type d : lib이름의 디렉토리만
find . -size +56 -print : 56블록보다 큰 것
find . -perm -1 -print : other에 실행권한 있는 파일 검색, -는 ‘rwx-‘중 하나(--------x)
find . -perm -44 -print : group(4), other(4)
find . -mtime +3 -print : 수정한지 3일이 지난 것(4, 5, 6일…)
find . -mtime 3 -print : 수정한지 3일 된 것
find . -mtime -3 -print : 수정한지 3일이 못된 것(0, 1, 2일…)