하위 디렉터리에서 목록 파일을 찾을 수 없는 이유는 무엇입니까? [복사]

하위 디렉터리에서 목록 파일을 찾을 수 없는 이유는 무엇입니까? [복사]

내 프로젝트의 하위 디렉터리에서 모든 자바스크립트 파일을 찾으려고 합니다.

작업 트리는 다음과 같습니다.

.
├── app
├── assets
├── components
├── email.txt
├── gulpfile.js
├── node_modules
└── package.json

이에 대해 나는 이렇게 말한다.

find . -name *.js

또는

find . -path *.js

이상한 점은 첫 번째 명령은 보고만 gulpfile.js하고 두 번째 명령은 아무것도 보고하지 않는다는 것입니다. 하지만 나는 .js파일을 가지고 app있고 components! node_modules왜 나타나지 않습니까?

답변1

작은따옴표로 묶으십시오 *.js. 따옴표가 없으면 쉘은 와일드카드를 현재 디렉토리의 일치하는 파일 이름으로 확장하므로 find현재 디렉토리 또는 조회 사양의 하위 디렉토리에 있는 파일 이름만 가져옵니다(그러나 와일드카드는 표시되지 않습니다). 이것을 사용할 모드로 지정하려면 find쉘 확장을 방지해야 합니다. '*.js'이 방법.

답변2

쉘 와일드카드가 이 프로세스에서 여전히 중요한 역할을 한다는 사실을 잊어버리기 쉽습니다. 따라서 *파일 목록으로의 확장을 방지하도록 쉘에 지시하는 방법이 필요합니다 . 한 가지 방법은 Chris Johnson이 언급한 인용문을 이용하는 것입니다.

다른 하나는 다음 *과 같은 문자를 이스케이프하는 것입니다.

find . -iname \*.js

비교하다:

$ strace -e trace=execve find -maxdept 1 -iname *.js > /dev/null                                      
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "file1.js", "file2.js"], [/* 75 vars */]) = 0
find: unknown predicate `-maxdept'
+++ exited with 1 +++

$ strace -e trace=execve find -maxdept 1 -iname \*.js > /dev/null                                     
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "*.js"], [/* 75 vars */]) = 0
find: unknown predicate `-maxdept'
+++ exited with 1 +++

*첫 번째 경우에는 현재 작업 디렉터리에 있는 파일 목록 으로 확장된 것을 볼 수 있습니다 . 두 번째 예에서 -는 리터럴 매개변수로 처리됩니다. 실제로 이는 이 매개변수를 참조하는 것과 동일한 결과를 생성합니다.file1.jsfile2.js*find

$ strace -e trace=execve find -maxdept 1 -iname '*.js' > /dev/null                                    
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "*.js"], [/* 75 vars */]) = 0
find: unknown predicate `-maxdept'
+++ exited with 1 +++

또는 대신 8진수 값을 사용할 수 있습니다 *.

$ strace -e trace=execve find -maxdept 1 -iname $'\52'.js > /dev/null                                 
execve("/usr/bin/find", ["find", "-maxdept", "1", "-iname", "*.js"], [/* 75 vars */]) = 0
find: unknown predicate `-maxdept'
+++ exited with 1 +++

관련 정보