cp 명령어는 옵션이 생각보다 많습니다. 그제, oh my zsh를 셋팅하는 과정에서 유용하게 써먹었던, -r과 -p 옵션만 배워보도록 하겠습니다. 사실, 그걸 셋팅할 때 cp -r을 하고, chown -r을 썼지만요.

 


 먼저, diff 명령어는 파일이 다른지를 비교합니다.

 

 

 -r 옵션을 치면, 디렉토리 하위에 있는 것들에 대해서 재귀적으로 연산을 수행하게 됩니다. 아래는 홈 폴더에 있는 aa와 bb에 대해서 재귀적으로 비교하는 연산입니다.

 

 

 -r 옵션은 본 거 같긴 한데 익숙치 않은 거 같습니다. 그런데, 사실 rm -rf * 도 많이 보던 류입니다. 해당 위치의 하위 폴더들을 재귀적으로, 강제로 삭제하겠다는 의미입니다. 그래서 진짜 조심해야 하는 명령어입니다.

 


 실습할 폴더들에 대한 정보입니다. tree aa는, aa에 있는 내용들을 트리 형식으로 출력해 줍니다.

 

 aa 안에 1.txt가 있고, aa 디렉토리가 있습니다. 그리고 bb 폴더에는 아래와 같은 내용이 저장되어 있습니다.

 

 

 그리고, bb 폴더나 aa 폴더 내에 있는 txt 파일들은 어떠한 내용도 쓰여 있지 않습니다. 그런데 하나 다른 점이 있다면, aa

는 소유자와 소유 그룹이 cho입니다. 그에 비해서 bb는 소유 그룹과 유저가 root입니다.

 

 

 ls -ail 명령어를 치면 알 수 있는 부분입니다. bb 안에 있는 1.txt와 aa의 소유자는 root입니다.

 

 

 aa 안에 있는 1.txt와 aa의 소유자는 cho입니다. 1.txt의 권한은 -rw-rw-r--임을 알 수 있는데요. 소유자가 root라면 당연하게도 유저 cho는 읽을 수는 있어도 파일을 수정할 수 없습니다.

 


  cp -r은 재귀적으로 폴더를 복사하는 명령어입니다. 재귀적이라는 용어가 뭔가 와 닿지 않는다면, 폴더의 하위 내용들을 모두 복사한다고 생각하시면 됩니다. C언어 강의에서 간단하게 cp 명령어도 구현해 보도록 하겠습니다.

 

 

 위에 있는 cp -r aa cc는 aa 폴더에 있는 하위 내용을 cc로 복사하라는 의미입니다. 그런데 루트로 수행하였습니다.

 

 

 cc에 있는 파일의 소유자를 확인해보면 cho가 아닌 root인 것을 확인할 수 있습니다. 이는, 내용은 복사되었지만, 메타 정보들까지 그대로 복사되지 않았기 때문입니다.

 

 

 -p 옵션을 주면, 몇 가지 정보들이 원본과 똑같이 유지됩니다. 디폴트는 mode와 ownership, timestamps 입니다.

 

 

 cp -rp aa dd를 하면, aa 안의 하위 내용들을 dd로 (재귀적으로) 복사합니다. dd에 있는 내용들을 확인해 보면 소유권이 root가 아닌, cho로 되어 있음을 알 수 있습니다.

 

 

  폴더 밑의 내용들이 다른지 재귀적으로 확인하기 위해서, diff -r 옵션을 주었습니다. 확인해 보니, aa랑 cc도, aa랑 dd도 다르지 않다는 것을 알 수 있습니다. 재귀적인 옵션들은 많이 쓰이니, 알아두면 좋을 듯 싶습니다.