Cardinal의 쿼리 언어는 Everything의 문법에 의도적으로 가깝지만, 현재 엔진이 실제로 구현한 내용을 반영합니다. 이 문서는 Rust 백엔드가 오늘 기준으로 이해하는 내용을 담은 기준 문서입니다.
English · Español · 한국어 · Русский · 简体中文 · 繁體中文 · Português · Italiano · 日本語 · Français · Deutsch · Українська · العربية · हिन्दी · Türkçe
- 모든 쿼리는 다음으로 이루어진 트리로 파싱됩니다:
- 단어 / 구문 (일반 텍스트, 따옴표 문자열, 와일드카드),
- 필터 (
ext:,type:,dm:,content:, …), - 불리언 연산자 (
AND,OR,NOT/!).
- 매칭은 파일의 전체 경로를 기준으로 수행되며 파일명만 보지 않습니다.
- 대/소문자 구분은 UI 토글로 제어됩니다:
- 대/소문자 구분 없음일 때는 이름/콘텐츠 매칭을 위해 쿼리와 후보를 모두 소문자로 변환합니다.
- 대/소문자 구분일 때는 바이트를 그대로 비교합니다.
빠른 예시:
report draft # 경로에 “report”와 “draft”가 모두 포함된 파일
ext:pdf briefing # 이름에 “briefing”이 포함된 PDF 파일
parent:/Users demo!.psd # /Users 아래에서 .psd 파일 제외
regex:^Report.*2025$ # regex에 일치하는 이름
ext:png;jpg travel|vacation # 이름에 “travel” 또는 “vacation”이 포함된 PNG/JPG
- 따옴표 없는 토큰은 경로에 대한 부분 문자열 매칭입니다:
demo는/Users/demo/Projects/cardinal.md와 일치합니다.
- 큰따옴표로 감싼 구문은 공백을 포함한 정확한 시퀀스와 일치합니다:
"Application Support"는/Library/Application Support/...와 일치합니다.
- UI 대/소문자 토글은 둘 다에 적용됩니다.
*는 0개 이상의 문자와 일치합니다.?는 정확히 1개의 문자와 일치합니다.**는 슬래시 사이에 있을 때 임의의 개수의 폴더 세그먼트를 넘나드는 글롭스타입니다.- 와일드카드는 단일 토큰 내부에서 해석됩니다:
*.rs—.rs로 끝나는 모든 이름.report-??.txt—report-01.txt,report-AB.txt등.a*b—a로 시작해b로 끝나는 이름.src/**/Cargo.toml—src/아래 어디든 있는Cargo.toml.
- 리터럴
*또는?가 필요하면 토큰을 따옴표로 묶으세요:"*.rs". 글롭스타는 독립된 슬래시 세그먼트여야 합니다 (foo/**/bar,/Users/**,**/notes).
Cardinal은 토큰 안의 “슬래시 세그먼트”를 이해하고 각 세그먼트를 경로 구성요소에 대한 접두사/접미사/정확/부분 문자열 매칭으로 분류합니다. 예시:
elloworl → Substring("elloworl")
/root → Prefix("root")
root/ → Suffix("root")
/root/ → Exact("root")
/root/bar → Exact("root"), Prefix("bar")
/root/bar/kksk → Exact("root"), Exact("bar"), Prefix("kksk")
foo/bar/kks → Suffix("foo"), Exact("bar"), Prefix("kks")
gaea/lil/bee/ → Suffix("gaea"), Exact("lil"), Exact("bee")
bab/bob/ → Suffix("bab"), Exact("bob")
/byb/huh/good/ → Exact("byb"), Exact("huh"), Exact("good")
이를 통해 다음을 표현할 수 있습니다:
- “폴더가 X로 끝나야 한다” (
foo/), - “폴더가 X로 시작해야 한다” (
/foo), - “경로 중간에 정확한 폴더 이름” (
gaea/lil/bee/).
Cardinal은 Everything의 우선순위를 따릅니다:
NOT/!가 가장 강하게 결합됩니다.OR/|가 그 다음입니다.- 암시적 / 명시적
AND(“공백”)는 가장 낮은 우선순위를 가집니다.
| 문법 | 의미 |
|---|---|
foo bar |
foo AND bar — 두 토큰이 모두 일치해야 합니다. |
foo|bar |
foo OR bar — 둘 중 하나만 일치하면 됩니다. |
foo OR bar |
` |
!temp |
NOT temp — 일치 항목을 제외합니다. |
NOT temp |
!temp와 같습니다. |
( ... ) |
괄호로 그룹핑합니다. |
< ... > |
꺾쇠 괄호로 그룹핑합니다 (Everything 스타일). |
우선순위 예시:
foo bar|baz # foo AND (bar OR baz)로 해석됨
!(ext:zip report) # ext:zip과 “report”가 모두 일치하는 항목 제외
good (<src|tests> ext:rs)
# good AND ((src OR tests) AND ext:rs)
기본 우선순위를 바꾸고 싶다면 괄호 또는 <...>를 사용하세요.
이 섹션은 현재 엔진이 실제로 평가하는 필터만 나열합니다.
참고: 필터 인자는 콜론 바로 뒤에 와야 합니다 (
ext:jpg,parent:/Users/demo).file: *.md처럼 공백을 넣으면 Cardinal이 이를file:필터(인자 없음)와 별도의*.md토큰으로 처리합니다.
| 필터 | 의미 | 예시 |
|---|---|---|
file: |
파일만 (폴더 제외) | file: report |
folder: |
폴더만 | folder:Projects |
다른 조건과 조합할 수 있습니다:
folder:Pictures vacation
file: invoice dm:pastyear
ext:는;로 구분된 하나 이상의 확장자를 받습니다:ext:jpg— JPEG 이미지.ext:jpg;png;gif— 일반적인 웹 이미지 유형.
- 매칭은 대/소문자를 구분하지 않으며 점(
.)을 포함하지 않습니다.
예시:
ext:md content:"TODO"
ext:pdf briefing parent:/Users/demo/Reports
ext:png;jpg travel|vacation
| 필터 | 의미 | 예시 |
|---|---|---|
parent: |
지정한 폴더의 직계 하위 항목만 | parent:/Users/demo/Documents ext:md |
infolder:/in: |
지정한 폴더의 모든 하위 항목 (재귀) | in:/Users/demo/Projects report draft |
nosubfolders: |
폴더 자체 + 직계 파일 (하위 폴더 없음) | nosubfolders:/Users/demo/Projects ext:log |
이 필터들은 절대 경로를 인자로 받으며, 앞의 ~는 사용자 홈 디렉터리로 확장됩니다.
type:은 파일 확장자를 의미 있는 카테고리로 묶습니다. 지원되는 카테고리(대/소문자 무시, 동의어 포함)는 다음과 같습니다:
- 이미지:
type:picture,type:pictures,type:image,type:images,type:photo,type:photos - 비디오:
type:video,type:videos,type:movie,type:movies - 오디오:
type:audio,type:audios,type:music,type:song,type:songs - 문서:
type:doc,type:docs,type:document,type:documents,type:text,type:office - 프레젠테이션:
type:presentation,type:presentations,type:ppt,type:slides - 스프레드시트:
type:spreadsheet,type:spreadsheets,type:xls,type:excel,type:sheet,type:sheets - PDF:
type:pdf - 압축 파일:
type:archive,type:archives,type:compressed,type:zip - 코드:
type:code,type:source,type:dev - 실행 파일:
type:exe,type:exec,type:executable,type:executables,type:program,type:programs,type:app,type:apps
예시:
type:picture vacation
type:code "Cardinal"
type:archive dm:pastmonth
자주 쓰는 type:의 단축 표현:
| 매크로 | 동일한 표현 | 예시 |
|---|---|---|
audio: |
type:audio |
audio: piano |
video: |
type:video |
video: tutorial |
doc: |
type:doc |
doc: invoice dm:2024 |
exe: |
type:exe |
exe: "Cardinal" |
매크로는 선택적 인자를 받을 수 있습니다:
audio:soundtrack
video:"Keynote"
size:는 다음을 지원합니다:
- 비교:
>,>=,<,<=,=,!= - 범위:
min..max - 키워드:
empty,tiny,small,medium,large,huge,gigantic,giant - 단위: bytes (
b), kilobytes (k,kb,kib,kilobyte[s]), megabytes (m,mb,mib,megabyte[s]), gigabytes (g,gb,gib,gigabyte[s]), terabytes (t,tb,tib,terabyte[s]), petabytes (p,pb,pib,petabyte[s]).
예시:
size:>1GB # 1 GB보다 큼
size:1mb..10mb # 1 MB에서 10 MB 사이
size:tiny # 0–10 KB (대략적인 키워드 범위)
size:empty # 정확히 0바이트
dm:/datemodified:— 수정 날짜.dc:/datecreated:— 생성 날짜.
다음을 허용합니다:
-
키워드 (상대 범위):
today,yesterdaythisweek,lastweekthismonth,lastmonththisyear,lastyearpastweek,pastmonth,pastyear
-
절대 날짜:
YYYY-MM-DD,YYYY/MM/DD,YYYY.MM.DDDD-MM-YYYY,MM/DD/YYYY같은 일반적인 일‑우선 / 월‑우선 형식도 지원합니다.
-
범위 및 비교:
- 범위:
dm:2024-01-01..2024-12-31 - 비교:
dm:>=2024-01-01,dc:<2023/01/01
- 범위:
예시:
dm:today # 오늘 수정됨
dc:lastyear # 지난 달력연도에 생성됨
dm:2024-01-01..2024-03-31 # 2024년 1분기 내 수정됨
dm:>=2024/01/01 # 2024-01-01 이후 수정됨
regex:는 토큰의 나머지를 경로 구성요소(파일 또는 폴더 이름)에 적용되는 정규식으로 취급합니다.
예시:
regex:^README\\.md$ parent:/Users/demo
regex:Report.*2025
UI 대/소문자 토글은 정규식 매칭에 영향을 줍니다.
content:는 파일 내용을 일반 문자열 부분으로 검색합니다:
content:안에는 regex가 없습니다 — 바이트 부분 문자열 매칭입니다.- 대/소문자 구분은 UI 토글을 따릅니다:
- 구분하지 않는 모드에서는 검색 문자열과 스캔된 바이트를 모두 소문자로 바꿉니다.
- 구분하는 모드에서는 바이트를 그대로 비교합니다.
- 매우 짧은 문자열은 허용되지만
""(빈 문자열)은 거부됩니다.
예시:
*.md content:"Bearer "
ext:md content:"API key"
in:/Users/demo/Projects content:deadline
type:doc content:"Q4 budget"
콘텐츠 매칭은 파일을 스트리밍 방식으로 처리하며, 멀티바이트 시퀀스가 버퍼 경계를 넘을 수 있습니다.
Finder 태그(macOS)로 필터링합니다. Cardinal은 파일 메타데이터에서 태그를 필요할 때 가져오며(캐시 없음), 결과가 큰 경우 mdfind로 후보를 좁힌 뒤 태그 매칭을 적용합니다.
;로 구분된 하나 이상의 태그를 허용합니다(논리 OR):tag:ProjectA;ProjectB.- 여러
tag:필터를 연결하면 논리 AND가 되어 여러 태그 매칭을 수행합니다:tag:Project tag:Important. - 대/소문자 구분은 UI 토글을 따릅니다.
- 태그 이름은 부분 문자열로 매칭합니다:
tag:proj는Project와project모두에 일치합니다.
예시:
tag:Important
t:Urgent
tag:ProjectA;ProjectB report
tag:Project tag:Archive report
in:/Users/demo/Documents tag:"Q4"
현실적인 조합 몇 가지:
# Documents의 Markdown 노트 (PDF 제외)
parent:/Users/demo/Documents ext:md
parent:/Users/demo/Documents !ext:pdf
# Reports에서 “briefing”이 언급된 PDF
ext:pdf briefing parent:/Users/demo/Reports
# 휴가 사진
type:picture vacation
ext:png;jpg travel|vacation
# 프로젝트 트리 안의 최근 로그 파일
in:/Users/demo/Projects ext:log dm:pastweek
# Scripts 폴더 바로 아래의 셸 스크립트
parent:/Users/demo/Scripts *.sh
# 경로에 “Application Support”가 포함된 모든 항목
"Application Support"
# regex로 특정 파일 이름 매칭
regex:^README\\.md$ parent:/Users/demo
# /Users 아래의 모든 PSD 제외
in:/Users demo!.psd
이 페이지를 현재 엔진이 구현한 연산자와 필터의 권위 있는 목록으로 사용하세요. Everything의 추가 기능(접근/실행 날짜나 속성 기반 필터 등)은 구문 수준에서는 파싱되지만 현재는 평가 단계에서 거부됩니다.