응용 프로그램 소스 파일로 가득 찬 폴더가 있고 프로젝트는 버전 제어를 위해 git을 사용하므로 디렉터리가 있습니다 .git
.
├── composer.json
├── .git
│ ├── branches
│ ├── config
│ ├── info
│ ├── logs
│ ├── objects
│ ├── packed-refs
│ └── refs
├── .gitignore
├── Gruntfile.js
├── less
│ ├── framework
│ ├── index.less
│ └── view_specific.less
├── package.json
[...]
.git
버전이 지정된 파일, 즉 디렉터리와 그 아래의 모든 항목을 무시하면서 모든 소스 파일에 대해 특정 작업을 수행해야 하는 경우가 종종 있습니다 .
나는 일반적으로 다음 과 같은 -not -path
옵션을 사용하여 디렉토리를 제외합니다.find
find . -not -path "*git*"
.gitignore
문제는 너무 광범위하다는 것입니다. 예를 들어 해당 파일과 해당 파일이 포함된 다른 파일을 제외합니다.자식그 중에는 예를 들면동요,도망자find
및 -name
스위치가 디렉터리와 그 내용을 -prune
대상으로 하는 것 같습니다 ..git
% find . -name ".git" -prune -o -print | grep git
./.gitignore
-name
하지만 파일 이름을 일치시키는 방법을 이해하지 못합니다 .
~에서man find
-name pattern Base of file name (the path with the leading directories removed) matches shell pattern pattern.
나에게 이것은 -name
패턴이 파일 이름의 마지막 세그먼트와 일치하는 경우에만 일치한다는 것을 의미합니다. 예를 들어 -name foo
일치 /dir1/dir2/foo
하지만아니요 /dir1/dir2/foo/dir3/dir4/some_file
나에게 요점은 경로 이름이 있는 파일(예: )과 -path
패턴을 일치시키는 것입니다 . 슬래시 내의 세그먼트와 정확히 일치하는 한 마지막 세그먼트뿐만 아니라 파일 경로의 모든 세그먼트와 일치하는 것 같습니다 . 그렇지 않으면 파일 이름을 일치시키는 방법은 무엇입니까 ?foo
/dir1/dir2/foo/dir3/dir4/some_file
-name
-name
답변1
.git
디렉토리와 그 아래의 모든 것을 무시하려면 다음과 같은 구성이 필요합니다.
find . \( -name '.git' -prune \) -o \( -print {or whatever else you want to do} \)
이는 해당 이름의 find
파일이나 디렉터리를 찾을 때를 나타냅니다..git
치다그 길을 더 아래로 내려가는 대신 나무들입니다. 다른 모든 것은 나머지 절반의 범위 내에서 일치되고 처리될 수 있습니다.또는조건부 건설.
(괄호 주위의 백슬래시는 쉘이 이를 처리하는 것을 방지하며 이 간단한 예에서는 기술적으로 불필요합니다. 명확하게 하기 위해 그대로 두었습니다.그리고그리고또는바인딩을 구성합니다. )
이제 다음과 같은 폴더에 대한 우려 사항을 고려하십시오 foo
.
예를 들어
-name foo
일치/dir1/dir2/foo
하지만 일치하지 않습니다./dir1/dir2/foo/dir3/dir4/some_file
당신 말이 맞지만, 나는 당신이 결과를 놓치고 있다고 생각합니다. 어느 시점에서는 find
도달할 것입니다 /dir1/dir2/foo
. will이 -name foo
일치하므로 -prune
will이 호출됩니다. 그 자체 를 먼저 보지 않고서는 아래 로 내려갈 수 있는 방법 이 없습니다 find
.foo
foo
그러므로 /dir1/dir2/foo/dir3/dir4/some_file
결코 도달할 수 없습니다.
검사의 초기 결과는 어느 정도 -name foo
일치 /dir1/dir2/foo/dir3/dir4/some_file
하지만 실제로는 일치 /dir1/dir2/foo
하며 트리에 대한 추가 검사는 폐기됩니다.
경로의 마지막 구성 요소로만 -name foo
일치하는 것과 비교하여 전체 경로인 경우에만 일치합니다 . (최상위 수준에서는 a와 일치할 수 있지만 결코 일치하지 않습니다.)foo
-path foo
foo
find * -path foo
foo
find . -path foo
./foo
답변2
당신의 이해가 -name
정확합니다. 파일 이름만 일치하며 파일로 연결되는 경로(디렉터리 체인)는 관련이 없습니다.
당신이 놓치고 있는 것은 효과입니다 -prune
. 비교됨
find . -name ".git" -o -print
이는 "호출되면 .git
아무 것도 하지 않고, 그렇지 않으면 경로를 인쇄하고 해당 경로로 재귀합니다(디렉토리인 경우)"를 의미합니다.
find . -name ".git" -prune -o -print
이는 "라고 불리는 경우 .git
, 다음을 의미합니다.반복하지 마세요, 그렇지 않으면 경로를 인쇄하고 그 경로로 재귀합니다(디렉토리인 경우)."