의 의미는 무엇입니까? 다음 명령을 기록하시겠습니까?
find /foo/path -name \?
답변1
?
특수문자다패턴 매칭, 단일 문자와 일치합니다.
/foo/path
따라서 이 명령의 의미는 하위 디렉터리에서 이름이 정확히 한 문자 길이인 모든 파일과 디렉터리를 찾는 것입니다 .
\?
쉘이 실행되는 것을 방지 하는 데 사용됩니다.파일 이름 생성. 다른 것을 사용할 수 있습니다인용 메커니즘:
find /foo/path -name '?'
또는:
find /foo/path -name "?"
?
참고 하시기 바랍니다파일 이름 확장 패턴절대 일치하지 않으며 슬래시로 인해 /
주어진 패턴도 계산에서 무시됩니다.-name
기본 이름()파일(A기본 이름경로 이름의 최종 또는 고유 파일 이름입니다. 아직 하나 있어요파일 이름, 경로 이름 컨텍스트에서 뒤에 슬래시가 올 수 있습니다):
$ mkdir a b
$ find a/ b/ -name a -o -name b\?
a/
출력만 a/
.
유일한 예외는 다음 을 참조하지 않는 /
구현 입니다 .//
//
/
$ find / ! -path / -prune -o -name \? -print
/
(POSIX 정의는 기본 이름 에 대해 약간 불분명합니다 /
.//
///+
)
또는 busybox에서 찾을 수 있습니다:
$ busybox find a/ b/ -name a -o -name b\?
b/
/
특정 패턴을 사용하려고 하면 -name
구현에 따라 동작이 달라집니다.
BSD find 및 heirloom find는 표현식을 false로 처리하고 아무것도 출력하지 않습니다.
$ find /tmp -name /tmp
$ echo "$?"
0
GNU find는 다음과 같은 경고 메시지를 표시합니다.
$ find /tmp -name /tmp
find: warning: Unix filenames usually don't contain slashes (though pathnames do).
That means that '-name ‘/tmp’' will probably evaluate to false
all the time on this system. You might find the '-wholename' test more useful,
or perhaps '-samefile'. Alternatively, if you are using GNU grep,
you could use 'find ... -print0 | grep -FzZ ‘/tmp’'.
반환 코드는 0입니다.
답변2
이는 ?
다음과 같은 메커니즘의 일부입니다.쉘의 "경로 이름 확장".
구어적으로 쉘 메커니즘을 "글로빙"이라고 합니다. 기본 glob은 세 문자만 사용하고 *
?
" [
패턴"을 만듭니다.
별표는 다음을 *
의미합니다.
- 모든 문자(모든 문자열).
물음표( ?
)는 다음을 의미합니다.
- 어떤 역할이든한 번.
대괄호는 문자 목록을 정의하며 [ ]
그 의미는 다음과 같습니다.
- 목록에 있는 문자만 한 번 계산됩니다. 부정적인 목록이 있을 수 있습니다.
그것들문자는 find 명령에서 비슷한 방식으로 사용됩니다.. 검색에서는 "패턴"이라고 합니다.
이는 동일한 작업(전역)을 수행하기 위해 동일한 문자를 사용하는 두 개의 엔터티가 있음을 의미합니다. 사람들에게 이러한 문자를 무시하라고 말해야 합니다. 특수 문자를 해석하지 않도록 쉘에 지시하는 일반적인 방법은 "인용"하는 것입니다. "작은따옴표", "큰따옴표" 또는 백슬래시를 사용하세요.
'?'
"?"
\?
find
이것이 바로 "패턴"이 인용된 이유입니다.
find /path/foo -name \?
이 줄은 다음을 의미합니다.
이 디렉터리에서 시작하여 /path/foo
이름이 한 문자인 모든 파일과 디렉터리를 나열합니다.
에 대한 /
알아채다? find의 패턴 확장에서 일치할 수 있습니다 /
.
find의 A는 find 명령의 피연산자 부분에 지정된 POSIX a와 pattern
일치합니다 ./
:
-path 패턴 현재 경로 이름이 패턴 일치 표기법에 설명된 패턴 일치 표기법을 사용하는 패턴과 일치하는 경우 기본 값은 true로 평가되어야 합니다. 파일 이름 확장 패턴의 추가 규칙은 확장이 아닌 일치 작업이므로 적용되지 않습니다.
다시 말하지만, (셸에서와 같이) 파일 이름 확장에 대한 추가 규칙은 적용되지 않습니다. 이는 확장이 아니라 일치 작업이기 때문입니다.
이것이 사실임을 증명하려면:
$ mkdir test; cd test
$ mkdir -p a/b/c/d
$ find a -path 'a?b'
a/b
$ find . -path './a?b?c?d'
./a/b/c/d
물론 -name
find의 옵션은 일치합니다.기본 이름파일의. 정의에 따르면 기본 이름에서 a를 일치시키는 /
것이 불가능하기 때문에 a가 있을 수 없습니다 ./