디렉토리와 파일 3

타키탸키·2021년 4월 5일
0

지난 시간에는 디렉토리와 파일 내부를 살펴보고 이동하고 이름을 변경할 수 있는 커맨드들을 배웠습니다.

이번 시간에는 디렉토리와 파일을 복사/붙여넣기 하고 삭제하며 출력할 수 있는 커맨드들을 함께 알아보겠습니다.

📃 디렉토리와 파일 복사/붙여넣기

디렉토리와 파일을 복사/붙여넣기 하는 방법을 알아봅시다. 'copy&paste'의 약어인 cp 커맨드를 사용하면 됩니다.

우선, touch 커맨드를 통해 parent 디렉토리 안에 파일을 하나 만듭니다. 다음으로 실제 폴더에 들어가서 파일이 잘 생성되었는지 확인해보겠습니다. 우분투 좌측 아이콘을 보면 Files가 있습니다. 이 곳에 parent라는 폴더가 있는 것을 확인할 수 있습니다.

parent 안에는 전에 만들었던 kid 폴더와 방금 생성한 first 파일이 들어있습니다.

first 파일을 열고 내용을 작성해보겠습니다.

수정된 내용을 저장하고 terminal로 돌아갑니다.

이제 first 파일을 second라는 이름으로 복사해서 붙여넣기 해보겠습니다. 이때, cp 커맨드를 적고 인자로는 복사할 파일 이름복사본 파일의 이름을 적어주면 됩니다.

cp first second


parent 내부를 보면 first와 second 둘 다 존재하는 것을 확인할 수 있습니다. 다시 Files로 돌아가서 복사/붙여넣기가 잘 되었는지 확인해보겠습니다.

second라는 이름에 first와 똑같은 내용이 잘 저장되어 있네요.

이번에는 다른 파일을 복사/붙여넣기 해보겠습니다. 홈 디렉토리의 파일을 이용할 건데요. 홈 디렉토리에 어떤 파일들이 있는지 다시 보겠습니다.

ls -a ~


이 중 .profile이라는 파일을 복사/붙여넣기 해보겠습니다.

cp ~/.profile second


아까와 동일한 second 파일에 profile 파일의 내용이 들어있습니다. 여기서 문제가 하나 있는데요. 앞서 second에는 first의 내용이 들어있었는데 덮어쓰기로 인해 그 내용이 사라져버렸습니다.

이처럼 붙여 넣으려는 이름의 파일이 이미 존재하면 기존 파일의 내용을 덮어쓰게 됩니다. 만약, 중요한 내용이 기존 파일에 들어있었는데 모르고 덮어써버리면 안되겠죠?

따라서, 파일을 복사/붙여넣기 할 때에는 붙여넣기 할 이름과 같은 이름의 파일이 있는지부터 확인해야 합니다. 앞서 배웠던 -i 옵션을 기억하시나요? 이 옵션을 사용하면 사용자로부터 실행 여부를 확인 받을 수 있습니다.

cp -i ~/.profile second


이와 같이 i 옵션을 주면 덮어 씌울 거냐고 묻는 메세지가 출력되는데요. y를 입력하면 실행하고 n을 입력하면 취소합니다.

복사/붙여넣기는 함부로 하게 되면 큰 문제가 발생하는 경우가 많기 때문에 cp 커맨드를 사용할 때는 되도록이면 꼭 i 옵션과 함께 사용하시길 바랍니다.

이번에는 디렉토리도 복사/붙여넣기 해보겠습니다. 앞서 parent 디렉토리에 kid라는 디렉토리가 들어 있는 것을 봤었죠? 이 kid 폴더를 baby라는 이름으로 복사/붙여넣기 해보겠습니다. 파일과 마찬가지로 복사할 디렉토리의 이름과 복사본 디렉토리의 이름을 인자로 적어보겠습니다.

cp kid baby

에러가 나네요. 사실 파일 복사/붙여넣기와 디렉토리 복사/붙여넣기에는 차이가 있습니다. 디렉토리의 경우 내부에 자식 디렉토리가 있고 그 자식 디렉토리 안에도 내용들이 존재합니다. 파일보다는 좀 더 복잡하죠.

그래서 디렉토리를 복사/붙여넣기 하기 위해서는 -r이라는 옵션이 필요합니다. 이는 recursive의 약어로 재귀를 뜻합니다. 재귀는 자기 자신을 반복해서 호출한다는 뜻을 가지고 있는데요. cp 커맨드에서 재귀란, 디렉토리를 복사/붙여넣기 할 때, 만약 그 안에 자식 디렉토리가 있으면 그 안의 내용들도 복사하고 또 그 안에 자식 디렉토리가 있으면 같은 작업을 반복한다는 뜻입니다.

r 옵션을 넣고 커맨드를 실행해보겠습니다.

cp -r kid baby

출력 내용을 보면 r 옵션이 없을 때는 옵션이 없다는 에러 메세지가 출력되는 반면에 r 옵션이 있을 때는 성공적으로 복사/붙여넣기가 적용되어 parent 내부에서 그 내용을 확인할 수 있습니다.

baby 디렉토리 내부를 살펴보면 kid 디렉토리와 마찬가지로 sample이라는 파일이 있는 것을 확인할 수 있습니다.

📃 디렉토리와 파일 삭제하기

이번에는 디렉토리와 파일을 삭제하는 방법을 배워보겠습니다. rm이라는 커맨드를 사용하면 됩니다. 이는 'remove'의 약어입니다.

parent 파일의 second를 삭제해보겠습니다. 인자에는 삭제할 파일의 이름만 적어주면 됩니다.

rm second

second 파일을 삭제하고 다시 parent의 내부를 살펴보면 second 파일이 없어진 것을 확인할 수 있습니다.

디렉토리도 삭제해볼까요? 복사/붙여넣기 할 때와 마찬가지로 디렉토리의 경우에는 r 옵션을 줘야 합니다. 디렉토리 속 자식 디렉토리의 내용들도 함께 삭제해야 되기 때문입니다.

이제 parent 디렉토리에는 kid 디렉토리와 first 파일만이 남았습니다.

복사/붙여넣기와 마찬가지로 삭제 또한 함부로 하게 되면 큰 문제가 될 수 있습니다. 따라서, i 옵션을 활용해야 하는데요. 디렉토리 내에 중요한 파일이 있다고 가정하고 i 옵션을 사용해보겠습니다.

kid 디렉토리 안에 trash라는 파일을 새로 생성합니다. 그 다음 i 옵션을 넣어 rm 커맨드를 실행합니다. 그럼 디렉토리 안으로 들어가겠냐는 질문을 합니다. y를 입력하면 디렉토리 안으로 들어가고 trash 파일을 지우겠냐는 질문을 합니다. trash는 지워도 되는 파일이니 y를 다시 입력합니다. 그럼 sample 파일을 지우겠냐는 질문을 또 합니다. 이때, n을 입력하면 sample 파일은 남게됩니다.

마지막으로 kid 폴더를 지우겠냐는 질문을 하는데 이때 y를 누르든, n을 누르든 상관이 없습니다. y를 누르면 에러가 나는데 이는 폴더가 없으면 파일이 존재할 수 없기 때문이죠. 이처럼 디렉토리 안에 파일이 하나라도 있으면 디렉토리를 삭제하려고 해도 오류가 나서 안됩니다.

이렇게 하면 kid 속 trash 파일만 삭제 되고 sample 파일은 남게 됩니다. kid의 내부를 확인하면 알 수 있죠. 이렇듯 i 옵션을 사용하면 디렉토리 속 파일을 하나하나 확인하면서 삭제를 진행할 수 있습니다.

📃 파일 내용 출력하기

이번에는 파일 내용을 출력해보겠습니다. 파일 출력 커맨드는 cat으로 이어 붙인다는 뜻을 가진 concatenate의 약어입니다. 다시 말해, 파일들의 내용을 이어서 출력한다는 의미를 가지고 있습니다.

for_you라는 파일 속 노래 가사를 출력해보겠습니다. 인자로는 파일 이름을 적으면 됩니다.

cat for_you

다른 파일도 이어서 출력해보겠습니다.

cat for_you jasmine


이처럼 cat 커맨드의 인자는 여러개를 줄 수 있습니다. 그런데 양이 너무 많아서 내용을 보기가 불편합니다. 이럴 때에는 less 커맨드를 사용하면 됩니다. 마찬가지로 인자파일 이름입니다.

less jasmine

위 화면을 보면 파일 이름이 하얗게 강조되어 있는데요. 이 상태가 바로 less 커맨드를 적용한 것입니다.

이때, 아래 화살표를 누르면 아래로 한 줄씩, 위 화살표를 누르면 위로 한 줄씩 이동합니다. 스페이스를 누르면 한 페이지씩 아래로, b를 누르면 한 페이지씩 위로 이동합니다. 맨 끝으로 가려면 대문자 G를, 맨 위로 가려면 소문자 g를 눌러주면 됩니다. 내용을 그만 보고 싶으면 q를 누르면 됩니다. 그럼 파일의 내용이 사라집니다.

이번에는 less에도 파일 이름 두 개를 적어보겠습니다.

less jasmine for_you


그런데 이번에는 맨 아래로 내려봐도 두 번째 파일인 for_you의 가사가 보이지 않습니다. 대신 파일 이름 부분에 (file 1 of 2)라는 문구가 추가 되었네요. 이는 다음 페이지가 존재한다는 것을 알려줍니다.

이처럼 less는 한 화면에 하나의 파일만을 보여줍니다. 그래서 다음 파일로 넘어가려면 콜론(:)을 누르고 n(next)을 누르면 됩니다.

이동이 잘 됐죠? 반대로 이전 파일로 돌아가고 싶으면 콜론(:)을 누르고 p(previous)를 누르면 됩니다.

정리하자면, 봐야할 내용이 적을 때는 내용을 이어서 출력하는 cat 커맨드를, 봐야할 내용이 많을 때는 한 화면에 하나의 파일 내용만 보여주는 less 커맨드를 사용하면 됩니다.

❗ less is more

그런데 less 커맨드의 이름은 왜 less일까요? 사실 less라는 커맨드가 생기기 이전에 파일의 내용을 출력해주는 more이라는 커맨드가 있었습니다.

more은 less와 유사한 기능을 가지고 있었는데요. 다만, 파일의 내용을 보다가 다시 역방향으로 올라갈 수 있는 기능이 없었습니다. 따라서, 이러한 단점을 보완한 less 커맨드가 만들어졌고 이 less가 기존의 more보다 더 낫다는 의미의 관용구로부터 less라는 이름을 가져온 것입니다.

📃 파일 내용 간단히 파악하기

그런데 항상 파일 내용을 전부 확인할 필요가 있을까요? 때로는 파일 내용의 일부를 간단히 파악하고 싶을 때가 있습니다. 이때, headtail이라는 커맨드를 사용할 수 있습니다.

head는 단어의 뜻에 맞게 파일의 맨 앞 부분을 출력하는 기능을 맡고 있습니다. LOVE라는 파일의 가사의 일부를 출력해보겠습니다. 인자로는 파일 이름을 적어주면 됩니다.

head love

그럼 위와 같이 첫 가사 10줄만을 출력해줍니다. 만약 출력된 내용이 부족하다면 어떻게 해야 할까요? 이때는 -n 옵션을 주면 됩니다. 옵션 뒤에는 출력하고 싶은 줄 수를 입력하고 마지막으로 파일 이름을 입력하면 됩니다.

head -n 15 love


그럼 다섯 줄이 더 추가되어 나옵니다.

이번에는 파일의 뒷 부분을 봅시다. 꼬리에 해당하는 tail 커맨드를 사용하면 됩니다. 인자는 head와 동일합니다.

tail love


뒷 부분 10줄이 잘 출력되었습니다. 마찬가지로 n 옵션을 사용해보겠습니다.

tail -n 15 love

뒷 부분 역시 15줄이 잘 출력되었습니다.

이처럼 파일 전체 내용을 볼 필요 없이 일부만 확인하고 싶다면 head와 tail 커맨드를 사용하면 됩니다.


이번 시간에는 디렉토리와 파일을 복사/붙여넣기 하고 삭제, 그리고 출력하는 법까지 배웠습니다. 명령어만으로 지금까지 배운 기능들을 실행할 수 있다는게 참 신기하네요.

다음 시간에는 여러가지 커맨드를 자유자재로 사용해볼 수 있도록 연습해보겠습니다.

* 이 자료는 CODEIT의 '유닉스 커맨드 라인' 강의를 기반으로 작성되었습니다.
profile
There's Only One Thing To Do: Learn All We Can

0개의 댓글