본문 바로가기

Tools and Utilities/Linux & Windows

[Linux 실습] Ch5. 파일 관리와 파일 명령어들(File management and General File commands)

오픈 소스 비영리 기관 '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그룹의 다른 사용자들이 내 파일을 읽거나 파일에 접근하지 못함.