파일을 만들고, 복사하고, 이름을 바꾸고, 지우고, 링크를 거는 명령이다. 지운 파일은 휴지통으로 가지 않는다.

touch와 mkdir

touch는 파일이 없으면 빈 파일을 만들고, 있으면 수정 시각을 지금으로 바꾼다.

Bash
touch notes.txt
touch -d '2026-01-01 09:00' notes.txt

mkdir는 디렉터리를 만든다. `-p`는 중간 디렉터리까지 만들고, 이미 있어도 실패로 보지 않는다. `-m`은 만들 때의 권한이다. umask는 여기서도 적용된다.

Bash
mkdir work
mkdir -p work/a/b
mkdir -m 755 shared

cp

Bash
cp a.txt b.txt
cp a.txt dir/
cp -a src dest
cp -a src/. dest/

대상이 이미 있는 디렉터리면 그 안에 복사된다. `cp -a src dest`에서 dest가 이미 있으면 결과는 `dest/src`다. src의 내용물만 dest 안에 넣으려면 `src/.`처럼 적는다.

`-a`는 권한, 시각, 심볼릭 링크를 가능한 한 유지하는 아카이브 복사다. 디렉터리를 그대로 옮길 준비에 맞다. `-r`도 디렉터리를 재귀로 복사하지만, 보존 범위는 `-a`보다 좁다.

Bash
cp -i a.txt b.txt
cp -n a.txt b.txt
cp -u a.txt b.txt
cp -v a.txt b.txt

`-i`는 덮어쓰기 전에 묻는다. `-n`은 대상이 이미 있으면 건너뛴다. `-u`는 대상이 없거나 더 오래되었을 때만 복사한다. `-v`는 복사한 이름을 보여 준다.

이름이 `-`로 시작하는 파일은 옵션으로 읽힐 수 있다. `--`를 사이에 둔다.

Bash
cp -- -notes.txt safe.txt

mv

mv는 이름을 바꾸거나 다른 디렉터리로 옮긴다. 같은 파일시스템 안에서는 이름만 바뀐다. 다른 파일시스템으로 옮기면 복사한 뒤 원본을 지운다. 도중에 끊기면 양쪽을 확인한다.

Bash
mv a.txt b.txt
mv a.txt dir/
mv -i old.txt new.txt

`-i`와 `-n`의 뜻은 cp와 같다.

rm과 rmdir

Bash
rm file.txt
rm -i file.txt
rmdir empty-dir
rm -r old-dir

rmdir는 비어 있는 디렉터리만 지운다. 내용까지 지우려면 `rm -r`이다.

변수가 비어 있는데 경로를 붙이면 지우는 범위가 달라질 수 있다. 지울 경로는 따옴표로 감싸고, 값이 있는지 확인한 뒤에 실행한다.

Bash
rm -rf -- "$dir"

`--`는 그 뒤의 인자를 옵션으로 해석하지 말라는 표시다.

ln

하드 링크는 같은 파일의 다른 이름이다. 심볼릭 링크는 경로를 적어 둔 파일이다.

Bash
ln file.txt hard.txt
ln -s /var/log/syslog ~/syslog
ls -l ~/syslog

하드 링크는 같은 파일시스템 안에서만 만들고, 디렉터리에는 보통 만들지 못한다. 원본 이름을 지워도 링크 수가 남아 있으면 데이터는 남는다. `ls -l`의 두 번째 숫자가 그 개수다.

심볼릭 링크는 다른 파일시스템을 가리킬 수 있다. 대상을 옮기거나 지우면 링크는 끊긴다. `ls -l`이 `이름 -> 대상`으로 보여 준다.

이미 있는 링크의 대상을 바꿀 때는 `-sfn`을 쓴다. `-n`은 링크가 디렉터리를 가리키고 있어도 그 링크 자체를 교체한다.

Bash
ln -sfn /new/target link-name