Linux/파일·파일 시스템 다루기

[Linux 파일 다루기] 15. $ ln과 $ find 명령어를 사용하여 파일에 링크 걸기 및 파일 찾기

Fletcher 2024. 8. 16. 14:16

 

반갑습니다!

 

이번 포스트에서는 $ ln 명령어를 사용하여 특정 파일에 링크를 걸고

$ find 명령어를 사용하여 파일을 검색해보도록 하겠습니다 ^^

 

 

 

 

1. 특정 파일에 링크 걸기 : $ ln

 

이 명령어는 어떤 파일을 다른 파일명으로 참조하거나

다른 디렉토리에서 해당 파일의 전체 경로 지정을 하지 않아도

손쉽게 참조하고 싶을 때 사용합니다 ^^!

 

cp 명령어로 파일을 복사하면 파일 시스템에 동일한 파일이 복제되어 생기지만,

ln 명령어는 파일 자체를 복사하는 대신에 참조만 만들기 때문에

특정 상황에서 파일 시스템을 더 효율적으로 사용할 수 있습니다 ^^

 

 

$ ln 명령어를 사용하여 test.txt 파일에 ln_sample.txt라는 이름의 링크를 생성하였습니다

-s 옵션을 지정하지 않았기 때문에 하드 링크로 생성이 되었는데요

$ cat 명령어를 사용하여 test.txt 파일과 ln_sample.txt 파일의 내용을 조회해보면

두 파일의 내용이 동일한 것을 볼 수 있겠습니다 ^^

 

 

 

여기까지만 보면 $ cp와 차이점이 드러나지 않는데요

그럼 test.txt 파일의 내용을 한 번 수정해보겠습니다

 

기존의 test.txt 파일의 내용 하단에 화살표로 가리킨 내용을 추가했습니다 ^^

test.txt 파일과 ln_sample.txt 파일은 링크가 걸려있는 상태이기 때문에

둘 중 어느 한 파일에 대한 수정(갱신)사항이 다른 파일에도 영향을 끼칠 것입니다 !

 

 

 

분명 test.txt 파일의 내용만 수정했는데,

보시는 바와 같이 test.txt 파일과 ln_sample.txt 파일의 내용이 서로 동일한

결과가 조회되는 것을 확인할 수 있겠습니다 ^^

 

$ ln 명령어는 첫 번째 인수로 지정한 원본 파일에,

두 번째 인수로 지정한 파일명으로 링크를 생성합니다

 

 

원본 파일을 오리지널 파일(Original File)이라 하고,

별명으로 작성한 파일을 링크 파일(Link File)이라고 합니다 ^^

 

$ ln 명령어의 옵션 중 -s 옵션이 있는데요

 

$ ln -s 형식으로 명령어를 입력하면

소프트 링크(Soft Link = 심볼릭 링크 Symbolic Link) 형식으로 생성되고,

상기 예시 이미지와 같이 아무 옵션도 지정하지 않으면

하드 링크(Hard Link) 형식으로 생성됩니다 ^^

 

 

 

소프트 링크와 하드 링크의 차이점이 무엇일까요?

예시 이미지를 통해서 알아보겠습니다 ^^

 

ln_sample.txt는 하드 링크 파일이고,

symbolic_sample.txt는 소프트 링크(심볼릭 링크) 파일입니다

 

두 링크 형식의 차이를 알아보기 위해 각각 원본 파일을 삭제한 다음

해당 링크 파일에 접근해보겠습니다 ^^

 

 

 

하드 링크 형식인 ln_sample.txt 파일의 원본인 test.txt 파일을 삭제하였고,

마찬가지로 소프트 링크 형식인 symbolic_sample.txt 파일의 원본인 test2.txt 파일을 삭제하였습니다

 

그리고 각각의 링크 파일의 내용을 $ cat 명령어를 사용하여 조회했는데요

하드 링크 형식인 ln_sample.txt 파일의 내용은 정상적으로 터미널에 출력이 됩니다

하지만 소프트 링크 형식인 symbolic_sample.txt 파일은 해당 명령어에 대해서 오류 메세지를 출력하는데요

No such file or directory라고 합니다

 

이와 같이, 하드 링크는 소유자가 오리지널 파일을 삭제하더라도

참조하는 링크 파일이 존재하면 파일의 실체는 남아있습니다

 

하지만 심볼릭 링크는 링크 파일에서 참조하려고 하면

이미 오리지널 파일이 삭제됐으므로 해당 파일이 존재하지 않는다는

에러 메세지가 출력됩니다 ^^

 

 

그리고 또 하나의 차이점이 있습니다

하드 링크는 동일한 파일 시스템에서만 사용할 수 있지만,

심볼릭 링크는 서로 다른 파일 시스템끼리 링크를 걸어도 사용이 가능합니다 ^^

 

 

 

해당 명령어의 주요 옵션은 다음과 같습니다

 

① -s

심볼릭 링크 형식의 별칭을 생성합니다

 

② -f

이름이 같은 파일이 있으면 덮어쓰기합니다

 

③ -i

이름이 같은 파일이 있으면 덮어쓰기 여부를 확인합니다

 

 

 

 

 

 

2. 특정 파일 찾기 : $ find

 

파일 시스템에서 특정 파일을 검색하려면 find 명령어를 사용할 수 있습니다 ^^

해당 명령어를 사용하면 해당 파일이 존재하는 경로를 출력해줍니다

 

검색 조건에는 해당 파일의 이름 뿐 아니라

갱신 시각, 파일 소유자명 등으로도 지정할 수 있습니다 ^^

 

 

$ find 명령어의 첫 번째 인자로는 검색 범위가 되는 디렉토리를 지정해주시면 되겠습니다 ^^

~는 홈 디렉토리를 의미합니다

첫 번째 인자 뒤에 옵션을 이용하여서 조건을 지정해주시면 되고,

그 뒤에는 해당 검색에 대한 처리를 지정해주시면 되겠습니다 ^^

 

상기 예시 이미지의 명령어를 해석해보면,

홈 디렉토리(~)에 대해서 test3.txt라는 이름의 파일(-name test3.txt)을 검색해서

화면에 파일 경로를 출력하라(-print)는 의미가 되겠습니다 ^^

 

그러므로 해당 명령에 대한 결과로 

/home/ubuntu/test3.txt터미널에 출력된 것을 확인할 수 있겠습니다!

 

 

 

 

이번엔 다른 조건으로 검색을 진행했습니다

홈 디렉토리가 아니라 루트 디렉토리를 검색의 범위로 지정했는데요

홈 디렉토리의 상위의 상위 디렉토리이므로 ../../로 지정했습니다 ^^

 

docker라는 이름을 가진 파일들에 대해서 터미널에 출력하게끔 하니

수많은 로그들이 찍힙니다 ^^

 

 

 

해당 명령어의 주요 옵션은 다음과 같습니다

 

[주요 검색 조건]

① -name name

파일명이 name인 파일을 검색합니다

 

② -mtime n

갱신 시각이 n일 이전인 파일을 검색합니다

 

③ -user user

파일 소유자가 user인 파일을 검색합니다

 

④ -regex regex

경로명 전체가 정규 표현식 regexp와 일치하는 파일을 검색합니다

 

⑤ -path ptn

경로명 전체가 문자열 ptn과 일치하는 파일을 검색합니다

 

 

[주요 처리 방법]

① -print

검색 결과를 표시합니다(기본값)

 

② -print0

검색 결과를 null 문자로 나눠서 출력합니다

 

③ -ls

검색 결과로 찾은 파일 정보를 표시합니다

 

④ -exec command [arg] \;

검색 결과로 command 명령어를 실행합니다

인수 arg에 {}를 지정하면 검색 결과가 치환되어 들어갑니다

 

⑤ -execdir command [arg] \;

-exec 옵션과 같지만 처리 대상 파일이 존재하는

디렉토리로 이동해서 command 명령어를 실행한 결과가 됩니다

 

⑥ -ok command [arg] \;

-exec 옵션과 같지만 command 명령어를

실행하기 전에 실행 여부를 확인합니다