내 프로젝트의 하위 디렉터리에서 모든 자바스크립트 파일을 찾으려고 합니다.
작업 트리는 다음과 같습니다.
.
├── 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.js
file2.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 +++