circle돌릴 때, 소스맵 지우기 위해서 명령어를 실행시키려고함
find ./build -type f -name "*.js" -delete
으로는 지워지는데
rm -rf */**/.js 로는 안지워짐... (내 인텔맥에서는 둘다 정상적으로 작동하더라)
이유가 뭘까?
circle돌릴 때, 소스맵 지우기 위해서 명령어를 실행시키려고함
find ./build -type f -name "*.js" -delete
으로는 지워지는데
rm -rf */**/.js 로는 안지워짐... (내 인텔맥에서는 둘다 정상적으로 작동하더라)
이유가 뭘까?
unquoted asterisk는 pathname expansion을 거칩니다. find 명령은 double quotes로 감쌌으므로 <*.js>는 expansion을 안 거치고 find 명령으로 들어가고 그 이후에 어떻게 처리되는가는 find의 영역입니다. 한편, rm의 경우 */**/.js 는 globstar 옵션이 꺼져있으면 */*/.js 와 동치이고 "아무 subdirectory 밑의 아무 subdirectory 밑의 .js 라는 이름을 가진 파일들"을 모두 찾아 그걸 인자로 쫙 늘어놓습니다.
예를 들어 foo1/.js foo1/a.txt foo1/bar1/.js 3개의 파일이 있다면 rm -rf */**/.js 는 pathname expansion을 거쳐 rm -rf foo1/.js foo1/bar1/.js 로 변환되어 실행됩니다.
말씀하신대로 expansion을 거쳐서 파일들을 찾아 명령어에 전달이 됬어야됐는데 왜 안됐을까요? ㅠㅠ (.js는 오타였고 rm -rf */**/*.js로 전달했었습니다)
globstar 옵션을 키면 ** 가 원하는대로 재귀적으로 모든 directory를 매칭합니다. 개인적인 생각으론 pathname expansion에 의존하지 말고 그냥 find 명령을 쓰는게 더 좋아보임
안지워진다는게 아무 것도 안지워진다는 얘기인가요.
넵 rm에 -v 옵션을 붙여서 확인했을때 출력물이 없습니다.
찾아보니까 circle ci 에서 globstar 옵션이 꺼져 있는 경우도 있다고 하네요
https://support.circleci.com/hc/en-us/articles/360007178074-Why-isn-t-my-glob-pattern-recursing-all-folders-
그럼
*/**/*.js 를 써도 */*/*.js 처럼 인식되고, 특정 폴더 모든 하위를 탐색하지 못하게 되는 거라고 추측 되는데 맞을까요?
제가 circleci 안써봐서 확신은 못하겠지만 globstar 옵션이 꺼져있으면 */*/*.js 와 동치이고 저 표현식은 상위 폴더의 개수가 정확히 2개인 js 파일들 밖에 매칭 못합니다.
아!!!!!!!!!!!!!!!! */**/*.js 는 하위 모든 .js들이고, */*/*.js 는 폴더 뎁스가 3개인 .js들을 찾는 거네요??