Red Hat Enterprise Linux 파일 관리

Red Hat Enterprise LinuxBeginner
지금 연습하기

소개

이 실습에서는 RHEL 환경에서 필수 명령줄 도구를 사용하여 파일 및 디렉터리를 관리하는 실질적인 경험을 쌓게 됩니다. pwdls를 사용하여 현재 위치를 탐색하고 내용을 나열하는 방법, cdtouch를 사용하여 디렉터리를 탐색하고 파일을 만드는 방법, mkdir, cp, mv, rm을 사용하여 파일 및 디렉터리를 효과적으로 구성하는 방법을 배우게 됩니다.

또한 ln (하드 링크 및 심볼릭 링크 모두) 을 사용하여 파일 간에 링크를 만드는 방법과 쉘 확장 (shell expansions) 을 사용하여 파일을 효율적으로 선택하는 방법을 익혀 명령줄 파일 관리에 대한 기본적인 기술을 갖추게 됩니다.

pwd 및 ls 명령어로 현재 위치 탐색 및 내용 나열

이 단계에서는 파일 시스템 내에서 현재 위치를 탐색하고 pwdls 명령을 사용하여 해당 내용을 나열하는 방법을 배웁니다. 현재 작업 디렉터리를 이해하고 해당 내용을 볼 수 있는 능력은 명령줄에서 파일을 탐색하고 관리하는 기본적인 기술입니다.

먼저 pwd 명령을 사용하여 현재 작업 디렉터리를 확인합니다. pwd는 "print working directory"의 약자로, 파일 시스템에서 현재 위치의 전체 경로 이름을 표시합니다.

pwd

현재 디렉터리를 나타내는 다음과 유사한 출력이 표시됩니다.

/home/labex

다음으로 ls 명령을 사용하여 현재 디렉터리의 내용을 나열합니다. ls는 "list"의 약자로, 지정된 디렉터리의 디렉터리 내용을 나열하거나 디렉터리가 지정되지 않은 경우 현재 작업 디렉터리의 내용을 나열합니다.

ls

홈 디렉터리의 내용을 보여주는 출력이 표시됩니다.

project

ls 명령에는 파일 및 디렉터리에 대한 추가 정보를 표시하는 몇 가지 유용한 옵션이 있습니다.

  1. -l 옵션 (long listing format) 은 권한, 하드 링크 수, 소유자, 그룹, 크기 및 마지막 수정 시간을 포함하여 각 파일 및 디렉터리에 대한 자세한 정보를 제공합니다.

    ls -l
    

    다음과 유사한 출력이 표시됩니다.

    total 0
    drwxr-xr-x 2 labex labex 6 Aug 27  2024 project
    
  2. -a 옵션 (all files) 은 숨김 파일 (hidden files) 을 포함한 모든 파일을 나열합니다. Linux 에서 점 (.) 으로 시작하는 파일 이름은 숨김 파일로 간주됩니다. 또한 .는 현재 디렉터리를 나타내고 ..는 상위 디렉터리를 나타냅니다.

    ls -a
    

    숨김 설정 파일 (hidden configuration files) 을 포함하여 다음과 유사한 출력이 표시됩니다.

    .  ..  .bash_history  .bash_logout  .bash_profile  .bashrc  .tmux.conf  project
    
  3. -l-a-la로 결합하면 숨김 파일을 포함한 모든 파일의 긴 목록을 볼 수 있습니다.

    ls -la
    

    이렇게 하면 숨김 파일을 포함한 모든 파일 및 디렉터리에 대한 자세한 정보가 표시됩니다.

    total 20
    drwx------ 1 labex labex  72 Jun  4 03:12 .
    drwxr-xr-x 1 root  root   19 Aug 27  2024 ..
    -rw------- 1 labex labex  31 Jun  4 03:13 .bash_history
    -rw-r--r-- 1 labex labex  18 Feb 15  2024 .bash_logout
    -rw-r--r-- 1 labex labex 141 Feb 15  2024 .bash_profile
    -rw-r--r-- 1 labex labex 877 Jun  4 03:12 .bashrc
    -rw-r--r-- 1 labex labex  68 Aug 27  2024 .tmux.conf
    drwxr-xr-x 2 labex labex   6 Aug 27  2024 project
    
  4. -R 옵션 (recursive) 은 모든 하위 디렉터리의 내용을 재귀적으로 나열합니다. 이를 시연하기 위해 먼저 하위 디렉터리를 만듭니다.

    mkdir mydir
    

    이제 ls -R을 사용하여 재귀적 목록을 확인합니다.

    ls -R
    

    mydirproject 디렉터리가 나열되고 그 뒤에 해당 내용이 표시됩니다.

    .:
    mydir  project
    
    ./mydir:
    
    ./project:
    

    마지막으로 다음 단계를 위해 환경을 정리하기 위해 mydir 디렉터리를 제거합니다.

    rmdir mydir
    

    이 명령은 비어 있는 디렉터리에만 작동합니다. rmdirrm에 대한 자세한 내용은 다음 단계에서 배웁니다.

Command line ls output example

cd 및 touch 명령어로 디렉터리 탐색 및 파일 생성

이 단계에서는 cd 명령을 사용하여 현재 작업 디렉터리를 변경하고 touch 명령을 사용하여 빈 파일을 만드는 방법을 배웁니다. 이러한 명령은 파일을 구성하고 파일 시스템을 효율적으로 탐색하는 데 필수적입니다.

먼저 현재 위치를 확인하고 단계 1 에서 표시된 project 디렉터리로 이동합니다.

pwd

출력으로 /home/labex (사용자의 홈 디렉터리) 가 표시되어야 합니다.

이제 cd 명령을 사용하여 project 디렉터리로 이동합니다.

cd project

새 위치를 확인합니다.

pwd

이제 /home/labex/project가 출력으로 표시되어야 합니다.

이제 현재 project 디렉터리 안에 documents라는 새 디렉터리를 만듭니다. 이전 단계에서 잠시 사용했던 mkdir 명령을 사용합니다.

mkdir documents

documents 디렉터리가 생성되었는지 확인합니다.

ls

출력에서 documents가 나열된 것을 볼 수 있습니다.

다음으로 cd 명령을 사용하여 쉘의 현재 작업 디렉터리를 새로 생성된 documents 디렉터리로 변경합니다.

cd documents

디렉터리를 변경한 후에는 pwd를 사용하여 새 위치를 확인하는 것이 좋습니다.

pwd

출력은 이제 /home/labex/project/documents여야 합니다.

cd 명령은 탐색을 위한 몇 가지 편리한 옵션을 제공합니다.

  1. cd -: 이 명령은 이전에 있었던 디렉터리로 이동합니다. 시도해 봅시다.

    cd -
    

    /home/labex/project로 돌아가야 합니다. pwd로 확인합니다.

    pwd
    

    이제 /home/labex/project/documents로 돌아가려면 cd -를 다시 사용합니다.

    cd -
    

    pwd로 확인합니다.

    pwd
    
  2. cd ..: 이 명령은 .. (두 개의 점) 숨김 디렉터리를 사용하여 상위 디렉터리로 한 수준 올라갑니다. 정확한 상위 디렉터리 이름을 알 필요가 없습니다.

    cd ..
    

    이제 /home/labex/project에 있어야 합니다. pwd로 확인합니다.

    pwd
    

    ..를 연결하여 여러 수준 위로 이동할 수 있습니다. 예를 들어 /home/labex/project에서 /home/labex로 이동하려면 다음과 같이 합니다.

    cd ../
    

    위치를 확인합니다.

    pwd
    

    /home/labex에 있어야 합니다.

  3. cd (인수 없이): 이 명령은 항상 홈 디렉터리 (이 경우 labex 사용자의 경우 /home/labex) 로 돌아갑니다.

    cd
    

    위치를 확인합니다.

    pwd
    

    /home/labex에 있어야 합니다.

이제 일부 파일을 만들기 위해 ~/project/documents 디렉터리로 다시 이동합니다.

cd ~/project/documents

위치를 확인합니다.

pwd

출력은 /home/labex/project/documents여야 합니다.

이제 touch 명령을 사용합니다. touch 명령은 파일을 수정하지 않고 파일의 타임스탬프를 현재 날짜 및 시간으로 업데이트합니다. 이 명령은 빈 파일을 만드는 데도 매우 유용합니다.

~/project/documents 디렉터리에 report.txtnotes.txt라는 두 개의 빈 파일을 만듭니다.

touch report.txt notes.txt

ls -l을 사용하여 파일이 생성되었는지 확인합니다.

ls -l

새로 생성된 파일을 보여주는 다음과 유사한 출력이 표시되어야 합니다.

total 0
-rw-rw-r--. 1 labex labex 0 Mar  7 HH:MM report.txt
-rw-rw-r--. 1 labex labex 0 Mar  7 HH:MM notes.txt

마지막으로 ~/project/documents 안에 drafts라는 새 디렉터리를 만들고 그 안에 파일을 만듭니다.

mkdir drafts
cd drafts
touch draft_v1.txt

파일 생성을 확인합니다.

ls -l

draft_v1.txt가 나열된 것을 볼 수 있습니다.

이제 단일 cd 명령을 사용하여 ~/project 디렉터리로 다시 이동합니다.

cd ~/project

위치를 확인합니다.

pwd

출력은 /home/labex/project여야 합니다.

mkdir, cp, mv, rm 명령어로 파일 및 디렉터리 정리

이 단계에서는 mkdir (make directory), cp (copy), mv (move/rename), rm (remove) 명령을 사용하여 파일 및 디렉터리를 효과적으로 구성하는 방법을 배웁니다. 이러한 명령은 깔끔하고 구조화된 파일 시스템을 유지하는 데 중요합니다.

먼저 ~/project 디렉터리에 있는지 확인합니다.

cd ~/project

현재 위치를 확인합니다.

pwd

출력은 /home/labex/project여야 합니다.

mkdir: 디렉터리 생성

이미 mkdir을 사용하여 단일 디렉터리를 생성했습니다. 이제 더 고급 mkdir 옵션을 살펴보겠습니다.

인수로 나열하여 한 번에 여러 디렉터리를 만들 수 있습니다.

mkdir reports presentations

생성 여부를 확인합니다.

ls

documents, presentations, reports가 나열된 것을 볼 수 있습니다.

mkdir 명령의 -p (parents) 옵션은 요청된 대상에 대해 누락된 상위 디렉터리를 만드는 데 매우 유용합니다. 이렇게 하면 존재하지 않는 상위 디렉터리 내에 하위 디렉터리를 만들려고 할 때 오류가 방지됩니다.

중첩된 디렉터리 구조 projects/alpha/docs를 만들어 보겠습니다.

mkdir -p projects/alpha/docs

이제 ls -R을 사용하여 새로 생성된 중첩 구조를 확인합니다.

ls -R projects

다음과 같이 표시되어야 합니다.

projects:
alpha

projects/alpha:
docs

projects/alpha/docs:

cp: 파일 및 디렉터리 복사

cp 명령은 파일 및 디렉터리를 복사합니다. 파일을 복사할 때 현재 디렉터리 또는 다른 지정된 디렉터리에 복제본을 만듭니다.

documents에서 reports 디렉터리로 report.txt를 복사해 보겠습니다.

cp documents/report.txt reports/

reports 디렉터리의 내용을 나열하여 복사를 확인합니다.

ls reports

reports 디렉터리에서 report.txt를 볼 수 있어야 합니다.

대상 디렉터리에 같은 이름의 파일이 이미 있는 경우 cp는 기본적으로 해당 파일을 덮어씁니다.

디렉터리와 해당 내용을 복사하려면 -r (recursive) 옵션을 사용해야 합니다. 기본적으로 -r이 지정되지 않으면 cp는 디렉터리를 무시합니다.

documents 디렉터리 전체를 projects/alpha/로 복사해 보겠습니다.

cp -r documents projects/alpha/

재귀적 복사를 확인합니다.

ls -R projects/alpha/documents

documents 디렉터리의 내용 (notes.txt, drafts, drafts/draft_v1.txt 포함) 이 이제 projects/alpha/documents 내에 복제된 것을 볼 수 있습니다.

projects/alpha/documents:
drafts  notes.txt  report.txt

projects/alpha/documents/drafts:
draft_v1.txt

mv: 파일 및 디렉터리 이동 및 이름 변경

mv 명령은 파일을 한 위치에서 다른 위치로 이동합니다. 파일이나 디렉터리의 이름을 바꾸는 데에도 사용할 수 있습니다. 파일의 절대 경로를 전체 이름으로 생각하면 파일을 이동하는 것은 파일을 이름 바꾸는 것과 사실상 동일합니다. 이동된 파일의 내용은 변경되지 않습니다.

documents 디렉터리에서 notes.txt의 이름을 meeting_notes.txt로 변경해 보겠습니다.

mv documents/notes.txt documents/meeting_notes.txt

이름 변경을 확인합니다.

ls documents

이제 notes.txt 대신 meeting_notes.txt가 표시되어야 합니다.

이제 reports 디렉터리에서 documents/draftsreport.txt를 이동합니다.

mv reports/report.txt documents/drafts/

이동을 확인합니다.

ls reports

이제 reports 디렉터리가 비어 있어야 합니다.

ls documents/drafts

documents/drafts 디렉터리에서 draft_v1.txtreport.txt를 볼 수 있어야 합니다.

mv-v 옵션은 명령 작업에 대한 자세한 출력을 표시하므로 확인에 도움이 될 수 있습니다.

mv -v documents/meeting_notes.txt documents/final_notes.txt

다음과 같은 출력이 표시됩니다.

renamed 'documents/meeting_notes.txt' -> 'documents/final_notes.txt'

rm: 파일 및 디렉터리 제거

rm 명령은 파일을 제거합니다. 삭제된 파일은 일반적으로 명령줄에서 복구할 수 없으므로 rm을 사용할 때 주의하십시오.

rm을 연습하기 위해 임시 파일을 만들어 보겠습니다.

touch temp_file.txt

이제 temp_file.txt를 제거합니다.

rm temp_file.txt

제거를 확인합니다.

ls

temp_file.txt는 더 이상 나열되지 않아야 합니다.

기본적으로 rm은 디렉터리를 제거하지 않습니다. 올바른 옵션 없이 비어 있지 않은 디렉터리를 제거하려고 하면 오류가 발생합니다.

rm presentations

다음과 같은 오류가 표시됩니다.

rm: cannot remove 'presentations': Is a directory

디렉터리와 해당 내용을 제거하려면 -r (recursive) 옵션을 사용해야 합니다. rm -r 명령은 각 하위 디렉터리를 먼저 탐색하고 각 디렉터리를 제거하기 전에 해당 파일을 개별적으로 제거합니다.

presentations 디렉터리와 해당 내용 (현재 비어 있지만 디렉터리의 경우 여전히 -r이 필요함) 을 제거해 보겠습니다.

rm -r presentations

제거를 확인합니다.

ls

presentations는 더 이상 나열되지 않아야 합니다.

rm-i 옵션은 각 파일을 삭제하기 전에 사용자에게 확인을 요청합니다. 이것은 좋은 안전 조치입니다.

몇 개의 임시 파일을 더 만들고 대화식으로 제거해 보겠습니다.

touch file1.txt file2.txt
rm -i file1.txt file2.txt

각 파일에 대해 프롬프트가 표시됩니다.

rm: remove regular empty file 'file1.txt'? y
rm: remove regular empty file 'file2.txt'? y

각 프롬프트에 y를 입력하고 Enter 키를 눌러 삭제를 확인합니다.

-f 옵션 (force) 은 사용자에게 확인을 요청하지 않고 제거를 강제합니다. -i-f를 모두 지정하면 -f가 우선합니다. -f는 극도로 주의해서 사용하십시오.

마지막으로 projects 디렉터리를 정리하겠습니다.

rm -r projects

projects가 사라졌는지 확인합니다.

ls

rmdir: 빈 디렉터리 제거

rmdir 명령을 사용하여 빈 디렉터리를 제거할 수도 있습니다. 디렉터리가 비어 있지 않으면 실패합니다.

빈 디렉터리를 만들고 rmdir로 제거해 보겠습니다.

mkdir empty_dir
rmdir empty_dir

제거를 확인합니다.

ls

empty_dir는 더 이상 나열되지 않아야 합니다.

rmdir로 비어 있지 않은 디렉터리를 제거하려고 하면 실패합니다.

mkdir test_dir
touch test_dir/test_file.txt
rmdir test_dir

다음과 같은 오류가 표시됩니다.

rmdir: failed to remove 'test_dir': Directory not empty

비어 있지 않은 디렉터리의 경우 rm -r을 사용해야 함을 기억하십시오.

rm -r test_dir

ln (하드 링크 및 심볼릭 링크) 명령어로 파일 간 링크 생성

이 단계에서는 ln 명령을 사용하여 파일 간에 링크를 만드는 방법을 배웁니다. Linux 파일 시스템은 하드 링크와 심볼릭 (또는 소프트) 링크의 두 가지 유형의 링크를 지원합니다. 이 둘의 차이점을 이해하는 것은 효과적인 파일 관리에 중요합니다.

먼저 ~/project 디렉터리에 있는지 확인합니다.

cd ~/project

현재 위치를 확인합니다.

pwd

출력은 /home/labex/project여야 합니다.

작업할 내용을 포함하는 original_file.txt라는 새 파일을 만들어 보겠습니다.

echo "This is the content of the original file." > original_file.txt

파일 내용을 확인합니다.

cat original_file.txt

하드 링크

하드 링크는 본질적으로 기존 파일에 대한 또 다른 이름입니다. 저장 장치의 동일한 데이터 (inode) 를 원본 파일과 동일하게 가리킵니다. 하드 링크가 생성된 후에는 새 하드 링크와 파일의 원본 이름 간의 차이를 알 수 없습니다. 둘 다 동일한 데이터에 액세스하는 동등하게 유효한 방법입니다.

ls -l 명령을 사용하여 파일에 여러 개의 하드 링크가 있는지 확인할 수 있습니다. ls -l 출력의 두 번째 열은 파일에 대한 하드 링크 수를 보여줍니다.

처음에는 original_file.txt에 하나의 하드 링크 (자체) 가 있습니다.

ls -l original_file.txt

하드 링크가 하나임을 나타내는 숫자 1이 있는 다음과 유사한 출력이 표시되어야 합니다.

-rw-rw-r--. 1 labex labex 35 Mar  7 HH:MM original_file.txt

이제 ln 명령을 사용하여 original_file.txthard_link.txt라는 하드 링크를 만들어 보겠습니다.

ln original_file.txt hard_link.txt

두 파일 모두에 대한 하드 링크 수를 확인합니다.

ls -l original_file.txt hard_link.txt

이제 두 파일 모두에 대해 하드 링크 수가 2로 표시되어야 하며, 이는 동일한 데이터를 가리키고 있음을 나타냅니다.

-rw-rw-r--. 2 labex labex 35 Mar  7 HH:MM hard_link.txt
-rw-rw-r--. 2 labex labex 35 Mar  7 HH:MM original_file.txt

동일한 데이터인지 확인하려면 ls -i 옵션을 사용하여 각 파일의 inode 번호를 나열할 수 있습니다. 파일이 동일한 파일 시스템에 있고 inode 번호가 동일하면 해당 파일은 동일한 데이터 파일 내용을 가리키는 하드 링크입니다.

ls -i original_file.txt hard_link.txt

inode 번호는 동일해야 합니다.

1234567 original_file.txt  1234567 hard_link.txt

한 파일의 내용을 수정하면 동일한 기본 데이터이므로 다른 파일에도 변경 사항이 반영됩니다.

echo "Adding new line." >> hard_link.txt
cat original_file.txt

다음과 같이 표시됩니다.

This is the content of the original file.
Adding new line.

원본 파일이 삭제되더라도 다른 하드 링크가 하나 이상 존재하는 한 파일 내용에 액세스할 수 있습니다. 데이터는 마지막 하드 링크가 삭제될 때만 저장소에서 삭제되며, 파일 내용은 어떤 하드 링크에서도 참조되지 않습니다.

original_file.txt를 제거해 보겠습니다.

rm original_file.txt

이제 hard_link.txt에 액세스해 보겠습니다.

cat hard_link.txt

내용이 여전히 표시됩니다.

This is the content of the original file.
Adding new line.

이제 hard_link.txt의 하드 링크 수는 1이어야 합니다.

ls -l hard_link.txt

하드 링크의 제한 사항:

  • 하드 링크는 일반 파일에만 사용할 수 있습니다. ln 명령을 사용하여 디렉터리나 특수 파일에 대한 하드 링크를 만들 수 없습니다.
  • 하드 링크는 두 파일이 동일한 파일 시스템에 있는 경우에만 사용할 수 있습니다. df 명령을 사용하여 파일 시스템을 나열할 수 있습니다.

심볼릭 링크

심볼릭 링크 ( "소프트 링크" 또는 "심볼릭 링크"라고도 함) 는 경로를 통해 다른 파일이나 디렉터리를 가리키는 특수 유형의 파일입니다. Windows 의 바로 가기와 유사합니다. 하드 링크와 달리 심볼릭 링크는 데이터에 직접 연결되지 않고 대상 파일 또는 디렉터리의 이름을 가리킵니다.

심볼릭 링크를 위한 target_file.txt라는 새 파일을 만들어 보겠습니다.

echo "This is the target file for the symbolic link." > target_file.txt

이제 ln -s 명령을 사용하여 target_file.txt를 가리키는 sym_link.txt라는 심볼릭 링크를 만들어 보겠습니다.

ln -s target_file.txt sym_link.txt

ls -l을 사용하여 심볼릭 링크의 세부 정보를 확인합니다.

ls -l target_file.txt sym_link.txt

몇 가지 차이점을 발견할 수 있습니다.

  • sym_link.txt의 긴 목록의 첫 번째 문자는 l(문자 l) 이며, 이는 심볼릭 링크임을 나타냅니다.
  • 출력에는 sym_link.txt -> target_file.txt가 표시되어 무엇을 가리키는지 명확하게 보여줍니다.
  • 심볼릭 링크의 크기는 매우 작습니다 (대상 경로의 길이일 뿐이며 대상 파일의 크기가 아님).
  • sym_link.txt의 하드 링크 수는 1입니다.
-rw-rw-r--. 1 labex labex 45 Mar  7 HH:MM target_file.txt
lrwxrwxrwx. 1 labex labex 14 Mar  7 HH:MM sym_link.txt -> target_file.txt

sym_link.txt를 통해 target_file.txt의 내용에 액세스할 수 있습니다.

cat sym_link.txt

다음과 같이 표시됩니다.

This is the target file for the symbolic link.

심볼릭 링크의 주요 차이점 및 동작:

  • 교차 파일 시스템 연결: 심볼릭 링크는 다른 파일 시스템의 두 파일을 연결할 수 있습니다.

  • 디렉터리 연결: 심볼릭 링크는 일반 파일뿐만 아니라 디렉터리를 가리킬 수 있습니다. documents 디렉터리에 대한 심볼릭 링크를 만들어 보겠습니다.

    ln -s documents doc_shortcut
    

    이제 documents 디렉터리 자체인 것처럼 doc_shortcut으로 cd할 수 있습니다.

    cd doc_shortcut
    

    위치를 확인합니다. pwd가 기본적으로 심볼릭 링크 경로를 표시한다는 점에 유의하십시오.

    pwd
    

    출력: /home/labex/project/doc_shortcut

    심볼릭 링크가 가리키는 디렉터리의 실제 경로를 표시하도록 pwd를 하려면 -P 옵션을 사용하십시오.

    pwd -P
    

    출력: /home/labex/project/documents

    이제 ~/project로 돌아갑니다.

    cd ~/project
    
  • 깨진 심볼릭 링크: 원본 일반 파일 (대상) 이 삭제되면 심볼릭 링크는 계속 존재하지만 없는 파일을 가리킵니다. 이를 "깨진 심볼릭 링크"라고 합니다.

    target_file.txt를 제거해 보겠습니다.

    rm target_file.txt
    

    이제 ls -lsym_link.txt를 확인합니다.

    ls -l sym_link.txt
    

    sym_link.txt는 여전히 존재하지만 대상 target_file.txt는 깨진 상태임을 나타내기 위해 빨간색 또는 다른 색상 (터미널 구성에 따라 다름) 으로 표시되는 것을 볼 수 있습니다.

    lrwxrwxrwx. 1 labex labex 14 Mar  7 HH:MM sym_link.txt -> target_file.txt
    

    깨진 심볼릭 링크를 cat하려고 하면 실패합니다.

    cat sym_link.txt
    

    출력:

    cat: sym_link.txt: No such file or directory
    

마지막으로 이 단계에서 만든 파일과 링크를 정리하겠습니다.

rm hard_link.txt sym_link.txt doc_shortcut
ls

이전 단계에서 남은 documentsreports 디렉터리만 보여야 합니다.

셸 확장 (Shell Expansions) 으로 효율적인 파일 선택하기

이 단계에서는 패턴 매칭 (Globbing), 물결표 확장 (Tilde Expansion), 중괄호 확장 (Brace Expansion), 변수 확장 (Variable Expansion), 명령어 치환 (Command Substitution) 등 다양한 쉘 확장 기능을 사용하여 파일과 디렉토리를 효율적으로 선택하는 방법을 배웁니다. 이러한 기능들을 사용하면 간결한 명령어로 여러 파일에 대해 작업을 수행할 수 있습니다.

먼저, ~/project 디렉토리에 있는지 확인합니다.

cd ~/project

현재 위치를 확인합니다:

pwd

출력 결과는 /home/labex/project여야 합니다.

쉘 확장을 시연하기 위해 파일과 디렉토리 세트를 생성해 보겠습니다.

mkdir data
cd data
touch file1.txt file2.log file_a.txt file_b.log report_2023.txt report_2024.log
touch image.jpg document.pdf archive.zip
mkdir dir1 dir2 dir3
cd ..

이제 data 디렉토리의 내용을 나열하여 생성한 파일을 확인합니다:

ls data

다음과 같이 보여야 합니다:

archive.zip  dir1  dir2  dir3  document.pdf  file1.txt  file2.log  file_a.txt  file_b.log  image.jpg  report_2023.txt  report_2024.log

패턴 매칭 (Globbing)

Globbing 이라고도 불리는 패턴 매칭은 메타 문자 (metacharacters) 라고 불리는 특수 문자를 사용하여 패턴에 따라 파일을 선택할 수 있게 해줍니다.

메타 문자 일치하는 항목 예시
* 0 개 이상의 모든 문자열. *.txt.txt로 끝나는 모든 파일과 일치합니다.
? 모든 단일 문자. file?.txtfile1.txt, fileA.txt 등과 일치합니다.
[abc...] 괄호 안에 있는 문자 중 하나. file[12].txtfile1.txt 또는 file2.txt와 일치합니다.
[!abc...] 괄호 안에 없는 문자 중 하나. file[!1].txtfileA.txt와 일치하지만 file1.txt와는 일치하지 않습니다.
[[:alpha:]] 모든 알파벳 문자. file[[:alpha:]].txtfileA.txt와 일치합니다.
[[:digit:]] 0 에서 9 사이의 모든 단일 숫자. file[[:digit:]].txtfile1.txt와 일치합니다.

data 디렉토리 내에서 몇 가지 예를 시도해 보겠습니다.

  1. * 사용: .txt로 끝나는 모든 파일을 나열합니다:

    ls data/*.txt
    

    출력:

    data/file1.txt  data/file_a.txt  data/report_2023.txt
    

    이름에 file을 포함하는 모든 파일을 나열합니다:

    ls data/*file*
    

    출력:

    data/file1.txt  data/file2.log  data/file_a.txt  data/file_b.log
    
  2. ? 사용: .log 앞에 정확히 한 문자가 있는 파일을 나열합니다:

    ls data/file?.log
    

    출력:

    data/file2.log
    
  3. 문자 집합에 [] 사용: report_로 시작하고 이름에 2023 또는 2024가 포함된 파일을 나열합니다:

    ls data/report_[2][0][2][34].*
    

    출력:

    data/report_2023.txt  data/report_2024.log
    
  4. 중괄호 확장 {} 사용: file로 시작하고 .txt 또는 .log로 끝나는 파일을 나열합니다:

    ls data/file*.{txt,log}
    

    출력:

    data/file1.txt  data/file2.log  data/file_a.txt  data/file_b.log
    

물결표 확장 (Tilde Expansion) ~

물결표 (~) 문자는 현재 사용자의 홈 디렉토리 (/home/labex) 로 확장됩니다. 사용자 이름이 뒤따르면 해당 사용자의 홈 디렉토리로 확장됩니다.

echo ~

출력:

/home/labex
echo ~root

출력:

/root
echo ~/project/data

출력:

/home/labex/project/data

중괄호 확장 (Brace Expansion) {}

중괄호 확장은 임의의 문자열을 생성합니다. 각 항목을 개별적으로 입력하지 않고도 유사한 이름을 가진 파일이나 디렉토리 목록을 만드는 데 유용합니다.

  1. 쉼표로 구분된 목록: report_jan.txt, report_feb.txt, report_mar.txt 파일을 생성합니다:

    touch data/report_{jan,feb,mar}.txt
    

    나열합니다:

    ls data/report_*.txt
    

    출력:

    data/report_2023.txt  data/report_jan.txt  data/report_feb.txt  data/report_mar.txt
    
  2. 숫자 또는 문자 범위: doc1.txt, doc2.txt, doc3.txt 파일을 생성합니다:

    touch data/doc{1..3}.txt
    

    나열합니다:

    ls data/doc*.txt
    

    출력:

    data/doc1.txt  data/doc2.txt  data/doc3.txt
    

    chapterA, chapterB, chapterC 디렉토리를 생성합니다:

    mkdir data/chapter{A..C}
    

    나열합니다:

    ls data/chapter*
    

    출력:

    data/chapterA  data/chapterB  data/chapterC
    

변수 확장 (Variable Expansion)

쉘 변수는 명령에서 확장될 수 있는 값을 저장합니다. 변수는 VARNAME=value를 사용하여 정의하고 $VARNAME 또는 ${VARNAME}을 사용하여 값에 접근합니다.

MY_DIR=data
echo "My directory is: $MY_DIR"

출력:

My directory is: data

변수를 명령어에 사용할 수 있습니다:

ls $MY_DIR

출력은 data 디렉토리의 내용이 될 것입니다.

명령어 치환 (Command Substitution)

명령어 치환을 사용하면 한 명령어의 출력을 다른 명령어의 일부로 사용할 수 있습니다. 이는 명령어를 $(command) 또는 백틱 `command`으로 묶어서 수행됩니다. $(command) 구문은 중첩이 가능하므로 일반적으로 선호됩니다.

현재 날짜를 가져와 파일 이름에 사용해 보겠습니다.

touch data/log_$(date +%Y-%m-%d).txt

새 파일을 보려면 data 디렉토리를 나열합니다:

ls data/log_*.txt

출력은 다음과 유사할 것입니다:

data/log_2024-03-07.txt

파일 개수를 세는 데 사용할 수도 있습니다:

echo "There are $(ls data | wc -l) items in the data directory."

출력은 다음과 유사할 것입니다:

There are 19 items in the data directory.

확장을 위한 인자 보호하기

때로는 쉘이 특정 문자를 확장하는 것을 방지해야 할 때가 있습니다. 다음 방법을 사용하여 수행할 수 있습니다:

  1. 백슬래시 (\): 다음 단일 문자를 이스케이프 (escape) 합니다.

    echo "The value of \$HOME is your home directory."
    

    출력:

    The value of $HOME is your home directory.
    
  2. 작은따옴표 (''): 따옴표 안의 모든 쉘 확장을 방지합니다.

    echo 'The current date is $(date +%Y-%m-%d).'
    

    출력:

    The current date is $(date +%Y-%m-%d).
    
  3. 큰따옴표 (""): 대부분의 쉘 확장을 방지하지만, 변수 확장 ($VAR) 과 명령어 치환 ($()) 은 허용합니다.

    MY_DATE=$(date +%Y-%m-%d)
    echo "Today's date is $MY_DATE."
    

    출력:

    Today's date is 2024-03-07.
    

    작은따옴표와 비교:

    echo 'Today is $MY_DATE.'
    

    출력:

    Today's date is $MY_DATE.
    

마지막으로, data 디렉토리를 정리하겠습니다.

rm -r data

요약

이 실습에서는 RHEL 에서 파일 및 디렉터리를 관리하는 기본적인 명령줄 도구를 배웠습니다. pwd를 사용하여 현재 작업 디렉터리를 식별하고 ls를 사용하여 디렉터리 내용을 나열하는 것부터 시작했으며, 상세 정보를 위한 -l 및 숨김 파일을 표시하기 위한 -a와 같은 옵션을 사용하는 방법을 포함했습니다. 그런 다음 cd를 사용하여 파일 시스템을 탐색하고 touch를 사용하여 새 파일을 만드는 방법을 익혔습니다.

또한 mkdir를 사용하여 디렉터리를 만들고, cp를 사용하여 파일 및 디렉터리를 복사하고, mv를 사용하여 이동하거나 이름을 바꾸고, rm을 사용하여 제거하는 등 파일 시스템을 구성하는 데 능숙해졌습니다. 이 실습에서는 ln을 사용하여 하드 링크 및 심볼릭 링크를 만드는 방법과 셸 확장을 사용하여 파일을 효율적으로 선택하는 방법을 다루어 명령줄에서 파일 및 디렉터리를 효과적으로 관리하는 능력을 향상시켰습니다.