Linux/Command Line

ls, find 명령어는 옵션에 따라 심볼릭 링크를 다르게 처리한다.

c4fiber 2024. 2. 23. 17:18

find 명령어를 공부하던 중 find /etc -print 명령어를 사용해서 하위 디렉토리와 파일을 출력하려고 했는데 실패했다.

혹시나 싶어 ls 명령어를 사용해보았는데 결과가 제각각 이였다.

궁금해서 원인을 찾아보고 내린 결론을 공유하고자 한다.

 

실행환경은 mac m2 air 15 / Sonoma 14.0 / zsh 를 사용했다.

3가지 명령어를 통해 하위 파일 및 디렉토리 출력 시도

 

1. (성공) ls /etc

내가 원하는 결과였지만 -l 옵션을 넣은 것 처럼 한줄씩 출력하고 싶었다.

 

2. (실패) ls -l /etc

심볼릭 링크에 대한 정보만 나왔다.

 

3. (실패) find /etc -print

왜 /etc만 나오고 하위 파일이나 디렉토리는 나오지 않을까?

 

 

왜 이런 문제가 발생했을까?

 

 

find 명령어가 내가 원하는 동작을 하지 않았던 이유

처음엔 chatGPT에게 물어보았는데 두 가지 해결방법을 제시했다.

1. find /etc/ -print

2. find -L /etc -print

 

첫번째 방법은 출력 결과가 깔끔하지 않아서 두번째 방법을 사용했다.

/etc// 형태인게 거슬렸다.

 

man find | grep -w "\-L" 명령어를 통해 확인해보니 심볼릭 링크일 경우 정상적으로 하위 파일와 디렉토리를 출력하도록 하는 옵션을 확인했다.

-> 이 옵션은 반드시 find -L /etc 처럼 경로 앞에 사용해야 한다.

 

 

ls 명령어는 되고 ls -l 은 안되는 이유

그럼 ls 명령어는 대체 무엇때문에 서로 다른 결과가 나왔을까?

 

http://www.gnu.org/software/coreutils/ls 여기서 coreutils 중 하나인 ls에 대한 정보를 얻을 수 있었고

dereference 옵션이 존재함을 확인할 수 있었는데

 

소스코드를 확인해보니 dereference 옵션이 4가지 존재한다. 주석을 통해 -L 옵션이 존재함을 알게 되었는데 조금 더 파봤다.

 

아래 코드를 보면 조건문을 통해 dereference이 정의되었는지 판단한다.

ls -L 옵션을 통해 정의해야 하는데 이를 사용하지 않았으므로 주어진 조건에 따라 심볼릭 링크를 역참조 할지 말지를 판단한다.

내가 사용한 -l 옵션은 format = long_format 역할을 하므로 dereference 가 DEREF_NEVER로 지정된다. 따라서 심볼릭 링크를 따라가지 않는 것이고 하위 경로를 출력하지 않았던 것이다.

 

 

공부해보면서 ls 는 gnu coreutils에 들어가지만 find 는 findutils로 분리된 점도 호기심을 자극했고

각종 linux 명령어들은 옵션에 따라 다르게 작동함을 알게 되어서 쉘 스크립트를 작성할 때 주의해야겠다는 생각을 했다.