명령 하는 일 pwd현재 디렉터리의 절대 경로 를 출력 (print working directory)cd 경로그 경로로 이동 cd 또는 cd ~홈 디렉터리 로cd ..상위 디렉터리로 cd -직전에 있던 디렉터리로
pwd # /home/user
cd /etc # 절대 경로로 이동
cd .. # / 로 올라감
cd ~ # 홈으로 복귀
cd는 절대 경로와 상대 경로를 모두 받는다. /home/user에 있을 때 cd docs와 cd /home/user/docs는 같은 곳으로 간다.
cd -는 직전 위치를 기억해 두었다가 돌아가므로, 두 디렉터리를 오가며 작업할 때 편하다.
~ 뒤에 사용자 이름을 붙이면 그 사용자의 홈 을 뜻한다 — cd ~alice는 /home/alice로 간다.
[user@localhost ~]$ cd /var/log
[user@localhost log]$ cd /etc
[user@localhost etc]$ cd -
/var/log
[user@localhost log]$ pwd
/var/log
옵션 뜻 -a숨김 파일 포함 (all)-l상세 정보 (long) — 권한·소유자·크기·시간 -h크기를 사람이 읽기 쉽게 (human) — KB, MB -t시간순 정렬-r역순 정렬 (reverse) -R하위 디렉터리까지 재귀적으로 -iinode 번호 표시
ls -l # 상세히
ls -la # 숨김 파일까지 상세히
ls -lh # 크기를 KB/MB 로
ls -ltr # 시간순 역순 — 최근 파일이 맨 아래
함께 알아 두면 문항의 보기를 가르기 쉬운 옵션이 몇 개 더 있다.
옵션 뜻 -d디렉터리 안이 아니라 디렉터리 자체 를 보여준다 (ls -ld /etc) -S크기순 정렬 (큰 것부터)-F이름 뒤에 종류 표시를 붙인다 — 디렉터리 /, 실행 파일 *, 심볼릭 링크 @ -A-a와 같되 .과 ..은 빼고 보여준다
⚠️ 대소문자가 다르면 다른 옵션이다. -r은 역순(reverse), -R은 재귀(recursive)다. -a는 .·..까지 전부, -A는 그 둘을 뺀다. -s는 블록 수 표시, -S는 크기순 정렬이다.
옵션 없는 ls는 이름순 으로 정렬한다. -t는 수정 시각이 최근인 것부터 , -S는 큰 것부터 이고 -r을 더하면 각각 뒤집힌다.
ls -a에 항상 보이는 .과 .. 는 현재 디렉터리와 상위 디렉터리를 가리키는 항목이다. 이름이 .으로 시작하므로 이들도 숨김 처리된다.
리눅스에서 숨김 파일은 이름이 .으로 시작 하는 파일이다. 별도의 속성이 아니다.
.bashrc, .ssh, .profile 처럼 설정 파일이 대부분 여기 해당한다.
그냥 ls로는 안 보이고 ls -a 를 써야 보인다.
-rw-r--r-- 1 user group 1024 Sep 3 09:00 a.txt
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │ └── 이름
│ │ │ │ │ │ └───────────── 마지막 수정 시각
│ │ │ │ │ └────────────────────── 크기(바이트)
│ │ │ │ └───────────────────────────── 그룹
│ │ │ └──────────────────────────────────── 소유자
│ │ └──────────────────────────────────────── 하드 링크 수
│ └─────────────────────────────────────────── 권한 (다음 주에 자세히)
└──────────────────────────────────────────────────── 파일 종류
맨 앞 한 글자가 파일 종류 다.
글자 종류 -일반 파일 d디렉터리 l심볼릭 링크 b블록 장치 (디스크) c문자 장치 (키보드)
실제 출력에서 종류별로 어떻게 보이는지 한 번에 본다.
$ ls -l /dev/sda /dev/tty /etc/passwd /bin /tmp -d
lrwxrwxrwx. 1 root root 7 Sep 3 09:00 /bin -> usr/bin
brw-rw----. 1 root disk 8, 0 Sep 3 09:00 /dev/sda
crw-rw-rw-. 1 root tty 5, 0 Sep 3 09:00 /dev/tty
-rw-r--r--. 1 root root 2104 Sep 3 09:00 /etc/passwd
drwxrwxrwt. 12 root root 4096 Sep 3 09:10 /tmp
심볼릭 링크는 이름 뒤에 -> 원본 이 붙고, 크기는 가리키는 경로의 글자 수 다(usr/bin은 7글자).
장치 파일은 크기 자리에 숫자 두 개(주 번호, 부 번호)가 나온다. 디렉터리의 크기는 안에 든 파일의 합계가 아니라 디렉터리 항목 자체의 크기 다.
ls -l이 보여 주는 시각은 마지막 수정 시각(mtime) 이다. 파일에는 시각이 세 가지 붙는다.
시각 바뀌는 때 보는 법 mtime (modify)파일 내용 을 고쳤을 때 ls -latime (access)파일을 읽었을 때 ls -luctime (change)권한·소유자 등 속성 이 바뀌었을 때 ls -lc
함정: ctime은 생성 시각(create)이 아니다. 상태가 바뀐(change) 시각이다. 내용을 고치면 mtime과 ctime이 함께 바뀌고, chmod만 하면 ctime만 바뀐다.
명령 하는 일 주의 mkdir 이름디렉터리 생성 중간 경로가 없으면 실패 mkdir -p a/b/c중간 경로까지 한 번에 생성rmdir 이름디렉터리 삭제 비어 있어야만 지워진다rm 파일파일 삭제 되돌릴 수 없다 rm -r 디렉터리디렉터리를 내용째 삭제 rm -f확인 없이 강제 삭제 touch 파일빈 파일 생성 / 시간 갱신
⚠️ rm -rf는 리눅스에서 가장 위험한 명령 이다. 휴지통이 없어 복구가 사실상 불가능하다. 경로를 지우기 전에 ls로 먼저 확인하는 습관이 안전하다.
직접 해 보면 오류 문구가 무엇을 요구하는지 보인다.
$ mkdir project/src/lib
mkdir: cannot create directory 'project/src/lib': No such file or directory
$ mkdir -p project/src/lib
$ touch project/src/lib/a.c
$ rmdir project
rmdir: failed to remove 'project': Directory not empty
$ rm project
rm: cannot remove 'project': Is a directory
$ rm -r project
옵션 뜻 rm -i지우기 전에 하나씩 물어본다 (interactive) rm -f묻지 않고, 없는 파일이어도 오류를 내지 않는다 (force) rm -r디렉터리를 하위 내용까지 (recursive) rm -v지운 항목을 출력한다 (verbose) rmdir -p a/b/cc를 지운 뒤 비게 된 상위 디렉터리도 차례로 지운다
-i와 -f를 함께 쓰면 뒤에 쓴 쪽이 이긴다. RedHat 계열은 root에게 rm을 rm -i로 별칭해 두는 경우가 많아, root가 rm을 치면 확인을 묻는 것이다.
touch는 파일이 없으면 빈 파일(0바이트)을 만들고, 있으면 내용은 그대로 둔 채 시각만 현재로 바꾼다. touch -t 202609031200 a.txt처럼 -t로 시각을 직접 지정할 수도 있다.
기호 일치하는 것 예 *0글자 이상 의 아무 문자열*.txt → a.txt, note.txt?정확히 한 글자 a?.txt → a1.txt (a10.txt는 아님)[abc]괄호 안 글자 중 하나 [ab].txt → a.txt, b.txt[a-z]범위 안 글자 중 하나 file[0-9] → file1[!abc]괄호 안 글자가 아닌 한 글자 [!a].txt → b.txt
ls * .txt # .txt 로 끝나는 것 전부
rm report?.bak # report1.bak, reportA.bak ...
cp [a-c] * .conf /tmp # a, b, c 로 시작하는 .conf
와일드카드는 명령이 아니라 셸이 먼저 풀어서 파일 이름 목록으로 바꾼 뒤 명령에 넘긴다. rm * 앞에서 ls *로 무엇이 걸리는지 확인할 수 있는 이유다.
*는 숨김 파일(.으로 시작)에는 일치하지 않는다. rm *을 해도 .bashrc는 남는다.
명령 하는 일 cp 원본 사본복사 cp -r 디렉터리 대상디렉터리 복사 — -r 필수 cp -i덮어쓰기 전에 물어본다 cp -p권한·시간 정보를 보존 하며 복사 mv 원본 대상이동 mv 옛이름 새이름이름 변경
mv 하나가 이동과 이름 변경을 겸한다. 리눅스에는 rename 전용 명령이 기본으로 없다.
같은 디렉터리 안에서 mv a.txt b.txt 하면 이름이 바뀌고, 다른 디렉터리를 대상으로 주면 이동한다.
mv는 -r이 필요 없다. 디렉터리도 그냥 옮겨진다.
cp a.txt b.txt # 파일 복사
cp -r docs backup # 디렉터리 복사 (-r 없으면 오류)
mv a.txt /tmp/ # 이동
mv old.txt new.txt # 이름 변경
cp와 mv는 마지막 인자가 이미 있는 디렉터리인지 에 따라 동작이 갈린다.
명령 backup이 없을 때backup이 있는 디렉터리 일 때cp -r docs backupdocs의 사본이 backup이라는 이름으로 생긴다backup/docs로 안에 들어간다mv docs backupdocs의 이름이 backup으로 바뀐다 backup/docs로 이동 한다
cp a.txt b.txt c.txt /tmp/ # 원본이 여러 개면 마지막은 반드시 디렉터리
mv * .log /var/backup/ # 여러 파일을 한 번에 이동
대상에 같은 이름의 파일이 있으면 묻지 않고 덮어쓴다. 막으려면 -i를 쓴다.
옵션 cpmv-i덮어쓰기 전에 확인 덮어쓰기 전에 확인 -f묻지 않고 강제 묻지 않고 강제 -v처리한 내용을 출력 처리한 내용을 출력 -u원본이 더 새로울 때만 복사 원본이 더 새로울 때만 이동 -b덮어쓸 파일의 백업 을 남김 덮어쓸 파일의 백업을 남김 -r / -R디렉터리를 하위까지 (필요 없음) -p권한·소유자·시각 보존 (이동은 원래 보존됨) -a-r에 속성·링크 보존까지 더한 백업용 옵션—
cp와 mv의 근본 차이. cp는 새 파일을 만든다 — 그래서 사본의 소유자는 복사한 사람이 되고 시각은 지금이 된다(-p로 원본 것을 유지). mv는 같은 파일 시스템 안에서는 데이터를 옮기지 않고 이름표만 바꿔 단다. inode가 그대로라 큰 디렉터리도 순식간에 옮겨지고, 그래서 -r이 필요 없다.
종류 명령 성질 하드 링크 ln 원본 링크같은 inode 를 가리킨다. 원본을 지워도 데이터가 남는다 심볼릭 링크 ln -s 원본 링크경로를 가리키는 바로가기 . 원본을 지우면 깨진다
심볼릭 링크는 ls -l에서 맨 앞이 l 로 표시되고 링크 -> 원본 형태로 보인다.
하드 링크는 다른 파일 시스템끼리는 만들 수 없고, 디렉터리에는 걸 수 없다.
파일 이름은 사실 inode라는 번호에 붙은 이름표 다. 실제 데이터와 권한·소유자·크기 정보는 inode가 갖고 있다. 두 링크의 차이는 여기서 나온다.
$ echo hello > a.txt
$ ln a.txt hard.txt
$ ln -s a.txt soft.txt
$ ls -li
131075 -rw-r--r--. 2 user user 6 Sep 3 09:00 a.txt
131075 -rw-r--r--. 2 user user 6 Sep 3 09:00 hard.txt
131090 lrwxrwxrwx. 1 user user 5 Sep 3 09:01 soft.txt -> a.txt
$ rm a.txt
$ cat hard.txt
hello
$ cat soft.txt
cat: soft.txt: No such file or directory
a.txt와 hard.txt는 inode 번호가 같고 링크 수가 2 다. 둘은 원본·사본 관계가 아니라 같은 파일의 동등한 두 이름 이다.
rm은 이름표 하나를 떼는 것이다. 링크 수가 0이 되어야 데이터가 지워지므로 a.txt를 지워도 hard.txt로 내용을 읽을 수 있다.
soft.txt는 inode가 따로 있고, 내용은 a.txt라는 경로 글자 뿐이다. 원본이 사라지면 가리킬 곳이 없는 끊어진 링크 가 된다.
비교 하드 링크 심볼릭 링크 inode 원본과 같다 따로 갖는다ls -l 첫 글자- (일반 파일과 구분 안 됨)l원본 삭제 시 내용 유지 끊어진다 다른 파일 시스템 불가 가능 디렉터리 대상 불가 가능 크기 원본과 같다 가리키는 경로의 글자 수
내일은 파일 안을 들여다보고 원하는 것을 찾아내는 명령들을 익힌다.
작업 디렉터리 : 지금 셸이 위치한 디렉터리. pwd로 확인한다.
숨김 파일 : 이름이 .으로 시작하는 파일. ls -a로만 보인다.
재귀(-r) : 하위 디렉터리까지 훑는 옵션. cp·rm에서 디렉터리를 다루려면 필요하다.
하드 링크 : 같은 inode를 가리키는 또 다른 이름.
심볼릭 링크 : 다른 파일의 경로를 담은 바로가기 파일. ln -s로 만든다.
touch : 빈 파일을 만들거나 기존 파일의 시간 정보를 갱신하는 명령.
mkdir -p : 중간 경로가 없으면 함께 만들어 주는 옵션.
📝 연습 문제 선택지를 클릭하면 정답·해설이 펼쳐집니다.
다음 중 숨김 파일을 포함해 파일 목록을 보려고 할 때 사용하는 옵션으로 알맞은 것은?
다음 중 디렉터리를 통째로 복사할 때 반드시 필요한 옵션으로 알맞은 것은?
다음 중 파일의 이름을 변경할 때 사용하는 명령으로 알맞은 것은?
다음 중 ls -l 결과의 맨 앞 문자가 d일 때 의미하는 것으로 알맞은 것은?
A 심볼릭 링크 B 블록 장치 파일 C 일반 파일 D 디렉터리 다음 중 여러 단계의 디렉터리를 한 번에 생성할 때 사용하는 명령으로 알맞은 것은?
A mkdir -a project/src/lib B mkdir -p project/src/lib C mkdir -r project/src/lib D rmdir -p project/src/lib