find 명령어를 공부하던 중 find /etc -print 명령어를 사용해서 하위 디렉토리와 파일을 출력하려고 했는데 실패했다.
혹시나 싶어 ls 명령어를 사용해보았는데 결과가 제각각 이였다.
궁금해서 원인을 찾아보고 내린 결론을 공유하고자 한다.
실행환경은 mac m2 air 15 / Sonoma 14.0 / zsh 를 사용했다.
3가지 명령어를 통해 하위 파일 및 디렉토리 출력 시도
1. (성공) ls /etc
2. (실패) ls -l /etc
3. (실패) find /etc -print
왜 이런 문제가 발생했을까?
find 명령어가 내가 원하는 동작을 하지 않았던 이유
처음엔 chatGPT에게 물어보았는데 두 가지 해결방법을 제시했다.
1. find /etc/ -print
2. find -L /etc -print
첫번째 방법은 출력 결과가 깔끔하지 않아서 두번째 방법을 사용했다.
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 명령어들은 옵션에 따라 다르게 작동함을 알게 되어서 쉘 스크립트를 작성할 때 주의해야겠다는 생각을 했다.
'Computer Science > Linux Command Line' 카테고리의 다른 글
linux cli 환경에서 디스크 인식 및 마운트 수행하기 (0) | 2025.04.10 |
---|---|
Linux 네트워크 수동 설정 (0) | 2025.04.10 |
nmcli 명령어로 네트워크 상태 확인 및 연결하기 (0) | 2025.04.10 |
vim 설정하기 (1) | 2017.04.07 |