
오픈 소스 비영리 기관 'Open Source Initiative'의 로고. https://opensource.org/
본 글은 학교 '오픈소스 소프트웨어 입문' 과목을 수강하며 실습(또는 공부)한 내용을 정리한 글입니다.
개인 기록 용도로 작성한 글이라, 직접 이 글을 보고 실습을 따라하기엔 어려움이 많을 것으로 예상됩니다.
혹시 본 글을 보며 Linux를 공부하실 목적이라면, 일단 키워드 위주로 AI에게 물어봐가면서, 본인의 Linux 터미널에서 직접 타이핑해가며 공부하시기를 추천드립니다.
질문이나 의견이 있다면 자유롭게 댓글 달아주세요!
File management
**Everything is file in linux**
File type - ("ls -CF")
* for executable
/ for directory
@ for symlink
| for fifo
= for socket
(NULL) for regular file
**File type - ls result (info ls)**
- regular file
**b block special file
c character special file**
d directory
**l symbolic link**
p FIFO
s socket link
**--- NetBSD**
a archive state 1
A archive state 2
w Whiteout
**--- Linux**
C high performance (“contiguous data”) file
D door (Solaris 2.5 and up)
M off-line (“migrated”) file (Cray DMF)
n network special file (HP-UX)
P port (Solaris 10 and up)
리눅스에서는 장치들을 ls -l 앞에 붙은 파일 타입으로 구분되는 special file로 관리함. 즉, 장치 또한 파일로 관리함.
그리고 ls -CF할 때 뒤에 뭐가 붙냐로 그 파일의 목적을 확인할 수 있음.
General File command
**Command**
touch - change modification data or create empty file
첫 번째는 그 파일의 modificaiton time를 바꾸고,
그 파일이 없다면 그 파일 이름을 이름으로 가지는 빈 파일을 생성함.
cp - copy
cp를 쓰고 파일이름을 여러 개 쓴 다음에 맨 뒤에 디렉토리를 쓰면,
그 디렉토리로 파일들을 복사시킨다는 의미임.
cp -A -r
디렉터리(또는 파일)를 복사하면서 모든 속성을 유지하는 명령어
mv - move or rename
파일을 다른 디렉토리로 옮기거나,
파일 또는 디렉토리의 이름을 변경할 수 있음.
file - determine file type
뒤에 오는 파일의 파일 타입을 알려줌.
determine이 들어간 의미는, 단순히 뒤에 오는 파일이 hello.c니까
c파일이구나! 하고 판단하는 게 아니라, 파일 내부를 읽은 후,
아! 이건 c파일이구나! 하고 판단한다는 거.
cat - print or concatenate(연결하다) files
파일들을 합치기 위해 만들어졌음.
근데, 파일을 읽어서 stdout으로 출력해주기도 함.
more/less - print file with page
cat을 쓰면, 터미널에 파일 내용이 다 출력돼서 스크롤이 확 내려가니까,
파일 내용을 한 페이지 한 페이지 단위로 출력해주는 명령어들.
grep/egrep/fgrep - print lines matching pattern
뒤에 오는 파일에서 뒤뒤에 오는 패턴을 가진 라인을 출력함.
find/locate - find file with name
**파일 이름이나, 파일이 만들어진지 얼마나 됐는지 등을 찾고 싶을 때 씀.
파일 내용에 어떤 게 있는지 찾고싶으면 이거 말고 grep을 써야 함.**
du - disk usage
파일이나 디렉터리의 디스크 사용량을 확인하는 데 사용함.
wc
파일의 행, 단어, 문자 수를 세는 명령어
wc myfile.txt, who | wc 등으로 사용.
결과가 15 75 834 lab0313/who_result
-> 해당 파일은 15줄이며, 75단어이며, 834개의 문자로 이루어졌다.
파일 명(경로)는 lab0313/who_result이다.
실습
PID TTY TIME CMD
2937539 pts/110 00:00:00 bash
2947133 pts/110 00:00:00 ps
이렇게 터미널이 안 뜨기도 하넹??
mkdir은 이미 파일이 존재할 경우,
mkdir: cannot create directory ‘lab0311’: File exists
같은 메시지가 출력되는데,
## 중요!!!!!!
위 메시지는, stderr로 출력된 것임. stdout이 아님.
우리가 ls를 하면, ls의 결과가 stdout에 출력됨.
근데, 리다이렉션을 쓰면 그 결과가 stdout이 아닌, 다른 곳으로
출력되도록 바꿀 수 있음.
ls > file
cat file
'''
a
b
file
'''
이 때, file 또한 ls의 결과에 들어간 건, file을 먼저 만들고 난 후,
그 다음에 ls 결과가 실행됐다는 거임.
여기서, file에 ls의 결과가 나와있는데,
어? 교수님, 왜 ls 결과가 줄바꿈으로 출력됐나요? ls 결과는 옆으로 출력되지 않나요?
-> 원래는 줄바꿈이 맞는데, stdout으로 출력할 경우는, 줄바꿈이 많이
일어나면 보기 불편하니까, 옆으로 최대한 출력해주는 거임.
ls | wc를 하면, ls의 결과를 wc의 입력으로 넣어줌.
wc (ls의 결과)와 동일.
wc file
`3 3 9 file`
-> 3줄, 3단어, 문자수 9개, 파일 명 file
ls -l
total 4
-rw-r--r-- 1 foss110 foss 0 Mar 13 09:27 a
-rw-r--r-- 1 foss110 foss 0 Mar 13 09:27 b
-rw-r--r-- 1 foss110 foss 9 Mar 13 09:30 file
ls a b c
ls: cannot access 'c': No such file or directory
a b
일단, stdout는 정상적인 실행 결과를 출력하기 위한 스트림임.
그러면, 위에서 ls: cannot 줄은 stderr로,
그 다음 줄 a b는 stdout로 출력된 것.
**중간고사) ls한 결과가 다음과 같았다. ls a b c 했더니 저럼.
그러면, 다음 명령의 실행 결과를 쓰시오.
`ls a b c > file2`
ls: cannot access 'c': No such file or directory
아까 결과의 첫 번째 줄만 stderr에 출력되고,
두 번째 줄은 file2로 들어감.
왜냐면, >은 stdout으로 출력될 내용을 뒤에 파일로 리다이렉션
해주는 거기에, stderr은 리다이렉션되지 못한 것임.
<https://jjeongil.tistory.com/1981**>
foss110@ajousw:~/lab0313$ cp a c
foss110@ajousw:~/lab0313$ ls -al
total 16
drwxr-xr-x 2 foss110 foss 4096 Mar 13 09:37 .
drwxr-xr-x 9 foss110 foss 4096 Mar 13 09:27 ..
-rw-r--r-- 1 foss110 foss 0 Mar 13 09:27 a
-rw-r--r-- 1 ㄹfoss110 foss 0 Mar 13 09:27 b
-rw-r--r-- 1 foss110 foss 0 Mar 13 09:37 c
-rw-r--r-- 1 foss110 foss 9 Mar 13 09:30 file
-rw-r--r-- 1 foss110 foss 4 Mar 13 09:35 file2
이렇게 했는데, 보면 c에 modification time이 a랑 다름. 현재 시간임.
근데 난 이걸 유지하고 싶은데..
그래서 man cp 해보니,
SYNOPSIS
cp [OPTION]... [-T] SOURCE DEST
기본적으론 위처럼 사용.
DEST가 디렉토리인지 파일인지 구별 없이, 무조건 파일로 복사
기본 cp SOURCE DEST는 DEST가 디렉토리면 내부로 복사하지만,
-T를 사용하면 덮어씌움
cp [OPTION]... SOURCE... DIRECTORY
위처럼 여러 개의 소스를 한꺼번에 복사할 수도 있음.
cp [OPTION]... -t DIRECTORY SOURCE...
-t : 위에 명령어를 쓸 건데, 대상 디렉토리를 먼저 지정
**-a, --archive**
same as -dR --preserve=all
👉 cp -p의 기능을 포함하면서, 추가적으로:
✅ 심볼릭 링크를 유지 (-P 효과 포함)
✅ 디렉토리를 재귀적으로 복사 (-r 효과 포함)
✅ 특수 파일 (소켓, FIFO 등) 유지
-p
same as --preserve=mode,ownership,timestamps
👉 파일을 복사할 때, 다음 속성을 보존함:
✅ 타임스탬프 (수정 시간, 접근 시간)
✅ 소유권 (UID, GID)
✅ 퍼미션 (권한, 모드)
--preserve[=ATTR_LIST]
preserve the specified attributes (default: mode,ownership,time‐
stamps), if possible additional attributes: context, links, xattr,
all
그래서, `mkdir test` 후 `cp a b c test`하면
a b c 파일들이 test 안에 복사되는데, 이제 -a를 붙여서 아래처럼 복사해보자.
`cp -a a b c test`
$ ls -l test
total 8
drwxr-xr-x 2 foss110 foss 4096 Mar 13 09:44 .
drwxr-xr-x 3 foss110 foss 4096 Mar 13 09:44 ..
-rw-r--r-- 1 foss110 foss 0 Mar 13 09:27 a
-rw-r--r-- 1 foss110 foss 0 Mar 13 09:27 b
-rw-r--r-- 1 foss110 foss 0 Mar 13 09:37 c
-> -a 옵션은 permission이나 time같은 걸 유지시켜줌.
who > who_result
grep foss146 who_result로 특정 결과만 찾아볼 수 있음.
여기서, ls는 **기본적으로 사전식(dictionary) 오름차순 순서**로 출력함.
숫자식(numeric) 오름차순이 아님!! 2보다 11이 앞에 있는 게 맞다.
반대로, **ls | sort -g** 하면 **숫자식 오름차순 출력**함.
뭐지 왜 알파벳이 먼저지 아스키 상 알파벳이 뒤인데... 일단 암기. 숫자가 문자열보다 뒤.
**sort -k 3 who_result** 하면 세 번째 key로 사전식 오름차순 sorting이 됨.
3번째 key는 여기서 접속 시간.
1번째 key가 foss000 이거, 2번째 key가 pts 저거. key index는 1부터 시작.
근데 5 하니까 아이피네. 4는 뭐지.
->**-k 3**은 날짜 기준으로 정렬하고,
**-k 4**는 시간 기준으로 정렬하려는 의도가 있지만,
날짜와 시간이 연결된 형태로 되어 있기 때문에 결과가 동일해 보입니다.
`find -name c`하면, 파일이름이 c인 파일을 검색.
`find -name c -print`와 같은 거임. 뒤에 print하겠단 동작이 생략된거.
만약 `find -name 1` 하면, 파일 1만 찾음.
근데, 1이 들어있는 또는 1로 시작하는 그런 파일들만 찾고 있을 수도 있잖음.
`find -name '1*'`하면, 1로 시작하는 파일들을 찾음.
`find -name c -exec rm {} \\;` 하면 c가 사라짐.
cd하고 옵션 빼면 홈 디렉토리 ~로 이동.
ls -l .하면 Maildir가 나옴.
mail foss000
Cc: (검열)
Subject: test
test
(ctrl D로 나옴)
ls -ld .하면,
drwxr-xr-x 9 foss110 foss 4096 Mar 13 10:02 .
이 디렉토리는 foss110고, 등등 디렉토리의 정보가 나옴
cd ../foss000하면 교수님 홈 디렉토리 들어갈 수 있는데,
그건 파일 그룹에 실행 권한(x)이 있기 때문. **실행 권한에 접근 권한도 포함되는 거임.
'**읽기, 쓰기, 실행' 권한이 소유자, 그룹, others
./test에서 touch (검열)하면,
touch: cannot touch '(검열)': Permission denied
왜냐면 파일 그룹 쓰기 권한(w)이 없음
교수가 chmod g+w . 하면 파일 그룹에 쓰기 권한이 추가됨.
drwxrwxr-x 2 foss000 foss 4096 Mar 13 10:08 .
위에는 test의 권한.
이렇게 이제 그룹 권한에 쓰기가 추가됨.
**중간고사)
파일의 소유자 foss000은 ~~~한 권한이 있다.
foss000이 아니고, foss 그룹의 멤버인 사용자들은 ~~~한 권한이 있다.
foss000이 아니고, foss 그룹의 멤버도 아닌 기타 사용자들은 ~~~한 권한이 있다.
이렇게 해석해야함!!
예를 들어, chmod 070 .로 d---rwx---가 된 파일이 있고, 내가 foss000이며,
해당 파일의 소유자는 foss000, 파일 그룹은 foss면,
나는 foss그룹에 속해 있지만, 파일의 소유자고 소유가한텐 권한이 없으므로,
나는 해당 파일에 ls를 쓸 수 없음!! 읽기 권한이 없기 때문.**
저 ls -ld .결과 보고 설명하라 할 수 있음.
교수가 chmod 070 . 하면,
d---rwx--- 2 foss000 foss 4096 Mar 13 10:10 .
우리는 여전히 ls -ld . 되지만, 교수는 ls -ld .가 안됨.
왜냐면, 파일의 소유주 foss000에게 읽기 권한이 없기 때문.
이제, 우리의 폴더에 와서 chmod 700 하면,
ls -ld . 하거나,
이제 ls /home/course/foss해서 보면,
drwx------ 9 foss110 foss 4096 Mar 13 10:02 foss110
로 내 권한이 바뀌어 있음.
이걸 해주면 foss그룹의 다른 사용자들이 내 파일을 읽거나 파일에 접근하지 못함.
'Tools and Utilities > Linux & Windows' 카테고리의 다른 글
[Linux 실습] Ch7. 파일 유틸리티들(File Utilities) (0) | 2025.03.27 |
---|---|
[Linux 실습] Ch6. 파일 권한(File Permission) (0) | 2025.03.27 |
[Linux 실습] Ch4. Linux의 디렉토리(Linux Directory) (0) | 2025.03.27 |
[Linux 실습] Ch3. 완전 기본적인 명령어들(Very basic commands) (0) | 2025.03.27 |
[Linux 실습] Ch2. 터미널과 명령어 설계(Terminal and Command Design) (0) | 2025.03.27 |