소개
Linux 는 / 루트 디렉터리에서 시작하는 하나의 디렉터리 트리로 파일을 구성합니다. 모든 파일과 디렉터리에는 해당 트리에서의 위치를 나타내는 경로가 있습니다. 경로를 읽고 사용하는 방법을 익히면 이후에 수행할 거의 모든 Linux 작업이 쉬워집니다.
이 실습에서는 터미널에서 일상적으로 사용하는 작업을 익히면서 작은 작업 공간을 구성합니다. 디렉터리를 탐색하고, 파일을 생성하고 편집하며, 데이터를 복사하고 이동합니다. 또한 파일을 검색하고, 메타데이터와 inode 를 확인하고, 하드 링크와 심볼릭 링크를 실험하며, diff로 파일과 디렉터리 트리를 비교합니다.
Linux 디렉터리 트리 탐색
이 단계에서는 현재 위치를 확인하고, 중요한 최상위 디렉터리를 살펴본 다음, 실습의 나머지 단계에서 사용할 전용 작업 공간을 만듭니다.
pwd 명령은 "print working directory"를 의미합니다. 먼저 이 명령을 실행하여 터미널이 시작된 위치를 확인합니다.
pwd
결과는 /home/labex/project여야 합니다. 절대 경로는 /로 시작하며 파일 시스템의 루트부터 위치를 나타냅니다.
파일 시스템의 최상위 항목을 나열합니다.
ls /
etc, home, tmp, usr, var와 같은 표준 디렉터리가 표시됩니다. 각 디렉터리의 일반적인 용도는 다음과 같습니다.
/etc에는 시스템 전체 설정이 저장됩니다./home에는 일반 사용자의 홈 디렉터리가 저장됩니다./tmp에는 임시 데이터가 저장됩니다./usr에는 설치된 여러 프로그램과 공유 리소스가 포함됩니다./var에는 로그와 캐시처럼 변경되는 데이터가 포함됩니다.
-d 옵션은 지정한 디렉터리의 내용을 나열하는 대신 디렉터리 자체를 표시하도록 ls에 지시합니다. -l 옵션은 긴 형식을 선택합니다.
ls -ld /etc /home /tmp /usr /var
각 줄의 첫 번째 문자는 d이며, 해당 객체가 디렉터리임을 나타냅니다. 나머지 열에는 권한, 소유권, 크기, 시간, 이름이 표시됩니다.
이 실습을 위한 작업 공간을 만듭니다. -p 옵션을 사용하면 mkdir이 없는 상위 디렉터리를 만들며, 디렉터리가 이미 존재해도 오류가 발생하지 않습니다.
mkdir -p /home/labex/project/file-ops-lab
작업 공간으로 이동한 뒤 새 위치를 확인합니다.
cd /home/labex/project/file-ops-lab
pwd
마지막 출력은 /home/labex/project/file-ops-lab이어야 합니다.
절대 경로와 상대 경로로 탐색하기
이 단계에서는 중첩된 디렉터리 트리를 만들고, 절대 경로와 상대 경로 및 탐색 단축 표현을 사용하여 디렉터리 사이를 이동합니다.
먼저 실습 작업 공간에서 시작하는지 확인합니다.
cd /home/labex/project/file-ops-lab
한 번의 명령으로 중첩된 디렉터리 3 개를 만듭니다.
mkdir -p navigation/alpha/beta
여기서 navigation/alpha/beta는 /로 시작하지 않으므로 상대 경로입니다. 셸은 이 경로를 현재 디렉터리를 기준으로 해석합니다.
절대 경로를 사용하여 가장 깊은 디렉터리로 이동합니다.
cd /home/labex/project/file-ops-lab/navigation/alpha/beta
pwd
특수 경로 ..는 상위 디렉터리를 의미합니다. beta에서 alpha로 이동합니다.
cd ..
pwd
출력은 /navigation/alpha로 끝나야 합니다. cd - 명령은 이전 작업 디렉터리로 돌아갑니다.
cd -
pwd
다시 beta에 있어야 합니다. 마지막으로 ~는 홈 디렉터리를 나타냅니다. 경로의 시작 부분에 사용하여 실습 작업 공간으로 돌아갑니다.
cd ~/project/file-ops-lab
pwd
절대 경로는 어느 위치에서든 사용할 수 있습니다. 현재 위치를 알고 있을 때는 상대 경로가 더 짧습니다.
디렉터리 생성 및 파일 작성
이 단계에서는 디렉터리와 파일을 만든 다음, 셸 리디렉션에서 기존 내용을 덮어쓰는 방식과 뒤에 추가하는 방식의 차이를 익힙니다.
실습 작업 공간에서 시작하여 한 번에 디렉터리 2 개를 만듭니다.
cd /home/labex/project/file-ops-lab
mkdir documents archive
지정한 파일이 존재하지 않을 때 touch 명령은 빈 파일을 만듭니다.
touch documents/empty.txt
긴 목록 형식으로 빈 파일을 확인합니다.
ls -l documents/empty.txt
파일 크기는 0바이트여야 합니다. 다음으로 >는 명령 출력을 파일로 리디렉션합니다. 파일을 만들거나 기존 내용을 바꿉니다.
echo "Linux file practice" > documents/notes.txt
>> 연산자는 기존 내용을 삭제하지 않고 출력을 파일 끝에 추가합니다.
echo "Paths identify each filesystem object" >> documents/notes.txt
cat으로 파일 전체를 표시합니다.
cat documents/notes.txt
원래 순서대로 두 줄이 표시되어야 합니다. wc -l을 사용하여 줄 수를 셉니다. -l은 wc가 줄 수를 세도록 지정합니다.
wc -l documents/notes.txt
첫 번째 필드는 2여야 합니다.
파일 복사, 이동, 이름 변경 및 삭제
이 단계에서는 파일 시스템 객체를 변경하는 네 가지 일반적인 방법인 복사, 이동, 이름 변경, 삭제를 연습합니다.
실습 작업 공간으로 돌아갑니다.
cd /home/labex/project/file-ops-lab
cp 명령은 원본을 대상 위치로 복사합니다. notes.txt를 새 이름으로 archive 에 복사합니다.
cp documents/notes.txt archive/notes-backup.txt
원본과 복사본이 모두 존재하는지 확인합니다.
ls -l documents/notes.txt archive/notes-backup.txt
임시 파일을 만든 다음, mv를 사용하여 한 번의 작업으로 파일을 이동하고 이름을 변경합니다.
echo "draft" > documents/draft.txt
mv documents/draft.txt archive/final-draft.txt
이전 경로는 더 이상 존재하지 않고 새 경로는 존재해야 합니다.
ls -l archive/final-draft.txt
디렉터리와 그 안의 모든 내용을 복사하려면 재귀 옵션 -r을 사용합니다.
cp -r documents archive/documents-copy
find archive/documents-copy -maxdepth 1 -type f
rm 명령은 파일을 영구적으로 삭제합니다. 터미널에는 휴지통이 없습니다. 삭제해도 되는 임시 파일을 만든 뒤 삭제합니다.
touch disposable.tmp
rm disposable.tmp
현재 디렉터리를 나열하여 해당 경로가 사라졌는지 확인합니다.
ls
disposable.tmp가 표시되지 않아야 합니다. rm을 사용하기 전에 항상 경로를 주의 깊게 확인합니다.
파일 확인, 수정 및 검색
이 단계에서는 여러 줄로 된 파일을 만들고, 파일의 여러 부분을 확인하며, 추가 리디렉션으로 내용을 수정하고, 이름으로 파일을 검색합니다.
실습 작업 공간으로 돌아갑니다. here-document 는 셸이 여기서 EOF인 지정한 표식만 포함된 줄에 도달할 때까지 여러 줄을 명령에 전달합니다.
cd /home/labex/project/file-ops-lab
cat > documents/journal.txt <<'EOF'
First entry: created a workspace
Second entry: practiced paths
Third entry: copied files
EOF
'EOF'를 따옴표로 감싸면 문서 안의 특수 문자를 셸이 확장하지 않습니다. 줄 번호와 함께 파일을 표시합니다.
nl -ba documents/journal.txt
-ba 옵션은 모든 줄에 번호를 붙입니다. 처음 두 줄에는 head -n 2를 사용하고, 마지막 줄에는 tail -n 1을 사용합니다.
head -n 2 documents/journal.txt
tail -n 1 documents/journal.txt
네 번째 항목을 추가합니다. 앞에서 사용한 >>는 기존의 세 줄을 바꾸지 않고 파일 끝에 출력을 추가합니다.
echo "Fourth entry: reviewed the results" >> documents/journal.txt
결과를 확인합니다.
tail -n 2 documents/journal.txt
이제 작업 공간에서 텍스트 파일을 검색합니다. find에서 .은 현재 디렉터리를 의미하고, -type f는 결과를 일반 파일로 제한하며, -name은 파일 이름 패턴과 일치하는 항목을 찾습니다. 따옴표를 사용하면 find가 *.txt를 받기 전에 셸이 이 패턴을 확장하지 않습니다.
find . -type f -name "*.txt"
출력에는 생성한 다른 텍스트 파일과 함께 ./documents/journal.txt가 포함되어야 합니다.
파일 형식, 메타데이터 및 inode 확인
이 단계에서는 파일 이름을 넘어 Linux 가 파일 시스템 객체에 저장하는 정보를 확인합니다.
실습 작업 공간에서 시작하여 서로 다른 두 객체를 file로 식별합니다.
cd /home/labex/project/file-ops-lab
file documents/journal.txt /bin/ls
journal 파일은 텍스트로 식별되고 /bin/ls는 실행 프로그램으로 식별됩니다. Linux 는 데이터의 종류를 판단할 때 파일 이름 확장자에만 의존하지 않습니다.
stat 명령은 크기, 권한, 소유자, 타임스탬프, inode 번호 등의 메타데이터를 표시합니다.
stat documents/journal.txt
inode 는 파일의 메타데이터를 저장하고 데이터 위치를 가리키는 파일 시스템 레코드입니다. 파일 이름은 inode 를 참조하는 디렉터리 항목입니다. 사용자 지정 stat 형식을 사용하여 안정적인 필드를 표시합니다.
stat -c 'name=%n type=%F size=%s inode=%i links=%h' documents/journal.txt
%i 필드는 inode 번호이고, %h는 해당 inode 를 참조하는 하드 링크 수입니다.
ls의 -i 옵션도 inode 번호를 표시합니다. 메타데이터 연습용 파일을 만든 다음 확인합니다.
echo "inode practice" > metadata-sample.txt
ls -li metadata-sample.txt
줄의 맨 앞에 있는 숫자가 inode 번호입니다. inode 번호는 환경마다 다를 수 있으므로 값을 외우기보다 해당 필드가 무엇을 나타내는지에 집중합니다.
하드 링크와 심볼릭 링크 사용
이 단계에서는 두 종류의 Linux 링크를 만들고 원본 파일 이름을 삭제했을 때 각각 어떻게 동작하는지 확인합니다.
실험용 디렉터리와 원본 파일을 만듭니다.
cd /home/labex/project/file-ops-lab
mkdir links
echo "shared inode data" > links/source.txt
옵션 없이 사용하는 ln 명령은 하드 링크를 만듭니다. 두 이름은 동일한 inode 와 파일 데이터를 참조합니다.
ln links/source.txt links/hard-link.txt
-s 옵션은 심볼릭 링크를 만듭니다. 심볼릭 링크는 symlink 라고도 하며 다른 파일의 경로를 저장합니다.
ln -s source.txt links/symbolic-link.txt
inode 번호와 링크 정보를 비교합니다.
ls -li links
source.txt와 hard-link.txt는 동일한 inode 번호를 가져야 합니다. 심볼릭 링크는 별도의 inode 를 가지며 -> source.txt를 표시합니다.
readlink를 사용하여 심볼릭 링크 내부에 저장된 경로를 표시합니다.
readlink links/symbolic-link.txt
원본 파일 이름을 삭제합니다.
rm links/source.txt
하드 링크를 통해 여전히 inode 와 해당 데이터를 읽을 수 있습니다.
cat links/hard-link.txt
심볼릭 링크는 이제 존재하지 않는 이름을 가리킵니다. 심볼릭 링크를 읽어 봅니다.
cat links/symbolic-link.txt
No such file or directory 오류가 표시되는 것은 예상된 결과이며 유용한 근거가 됩니다. 링크 객체는 남아 있지만 저장된 대상 경로가 끊어진 상태입니다. 이 실험을 통해 다른 하드 링크가 남아 있는 동안 하드 링크 이름 하나를 삭제해도 데이터가 삭제되지 않는 이유와, 심볼릭 링크는 저장된 대상 경로에 의존한다는 점을 확인할 수 있습니다.
Diff 로 파일 및 디렉터리 비교
이 단계에서는 diff를 사용하여 차이점을 찾고, 작은 두 디렉터리 트리를 동기화합니다.
버전 디렉터리 2 개를 만듭니다.
cd /home/labex/project/file-ops-lab
mkdir -p comparison/version-a comparison/version-b
한 줄이 서로 다른 설정 파일을 만듭니다.
printf 'mode=production\nport=8080\n' > comparison/version-a/app.conf
printf 'mode=production\nport=9090\n' > comparison/version-b/app.conf
-u 옵션을 사용하면 각 변경 사항 주변의 문맥을 포함한 통합 형식으로 diff 결과를 표시합니다.
diff -u comparison/version-a/app.conf comparison/version-b/app.conf
diff는 첫 번째 파일의 줄 앞에 -를 표시하고 두 번째 파일의 줄 앞에 +를 표시합니다. 종료 상태가 0 이 아니면 파일이 서로 다르다는 의미이며, 여기서는 예상된 결과입니다.
두 번째 파일을 첫 번째 파일과 일치하도록 만든 다음, -q를 사용하여 조용한 방식으로 같은지 확인합니다.
cp comparison/version-a/app.conf comparison/version-b/app.conf
diff -q comparison/version-a/app.conf comparison/version-b/app.conf
출력이 없으면 두 파일이 일치한다는 뜻입니다. 이제 한 디렉터리에만 파일을 추가합니다.
echo "release notes" > comparison/version-a/README.txt
-r 옵션은 디렉터리 트리를 재귀적으로 비교합니다.
diff -r comparison/version-a comparison/version-b
출력에는 README.txt가 version-a에만 존재한다고 표시됩니다. 해당 파일을 복사한 다음 다시 비교합니다.
cp comparison/version-a/README.txt comparison/version-b/README.txt
diff -r comparison/version-a comparison/version-b
마지막 명령에서 출력이 없어야 합니다. 이는 이제 두 디렉터리 트리에 동일한 파일 내용이 들어 있음을 의미합니다.
요약
Linux 터미널 작업에서 사용하는 핵심 파일 및 디렉터리 작업을 연습했습니다. 절대 경로와 상대 경로로 탐색하고, 파일을 생성하고 편집하며, 데이터를 복사하고 이동했습니다. 또한 삭제해도 되는 파일을 안전하게 삭제하고 파일 이름으로 검색했습니다.
파일 형식과 메타데이터를 확인하고, 파일 이름과 inode 의 관계를 익혔으며, 하드 링크와 심볼릭 링크를 비교했습니다. 마지막으로 diff를 사용하여 개별 파일과 전체 디렉터리 트리를 비교했습니다. 이러한 개념을 익히면 명령을 단순한 개별 사용법으로 외우는 대신 Linux 파일의 동작을 이해하며 작업할 수 있습니다.



