찾기를 사용하여 하위 디렉토리 제외


115

다음과 같은 디렉토리 구조가 있습니다.

data
|___
   |
   abc
    |____incoming
   def
    |____incoming
    |____processed
   123
    |___incoming
   456
    |___incoming
    |___processed

Data 디렉터리 내의 모든 폴더에는 들어오는 하위 폴더가 있습니다. def / incoming 및 456 / incoming dirs를 제외한 모든 폴더와 하위 폴더에서 모든 파일을 가져오고 싶습니다. 다음 명령으로 시도했습니다.

 find /home/feeds/data -type d \( -name 'def/incoming' -o -name '456/incoming' -o -name arkona \) -prune -o -name '*.*' -print

그러나 예상대로 작동하지 않습니다.

라비


3
이것은 좋은 조언은 아니지만 많은 상황에서 빠르고 더러운 상황에서 빠져 나갈 것입니다. grep -v something원하지 않는 것을 배제하는 파이프
Miquel

이것이 귀하의 질문에 대답합니까? find에서 디렉토리를 제외하는 방법. 명령
imz-Ivan Zakharyaschev

답변:


206

이것은 작동합니다 :

find /home/feeds/data -type f -not -path "*def/incoming*" -not -path "*456/incoming*"

설명:

  • find /home/feeds/data: 지정된 경로에서 재귀 적으로 찾기 시작
  • -type f: 파일 만 찾기
  • -not -path "*def/incoming*": def/incoming경로의 일부로 포함하지 마십시오.
  • -not -path "*456/incoming*": 456/incoming경로의 일부로 포함하지 마십시오.

"find : bad option -not find : path-list predicate-list"오류 발생
Ravi

@Ravi는 bash 쉘을 사용하고 있습니까? 방금 터미널에서 테스트했는데 저에게 효과적입니다. 스크립트를 수정 한 경우 대신 솔루션을 복사하여 붙여 넣으십시오.
sampson-chen

작동하지만 해당 디렉토리에 파일이 아닌 디렉토리를 나열합니다.
Ravi

1
-path전체 문자열과 일치하므로을 수행하는 경우 문자열은 find .다음 -path./path/to/directory/*
Heath Borders

1
참고 -not -path로이 예제에서는 확실히 작동하지만 find여전히 디렉토리 구조를 반복하고 CPU주기를 사용하여 모든 디렉토리 / 파일을 반복합니다. find이러한 디렉토리 / 파일 (아마도 수백만 개의 파일이있을 수 있음)에 대한 반복 을 방지 하려면 사용해야합니다 -prune( -prune하지만이 옵션은 사용하기 어렵습니다).
Trevor Boyd Smith

9

문서화를 위해서 : search'n'skip 별자리가 많기 때문에 더 깊이 파야 할 수도 있습니다. 당신이 기대하는 것을하지 않는 prune동안 당신의 친구 라는 것이 밝혀 질 수도 있습니다 -not -path.

따라서 이것은 디렉토리를 제외하는 15 개의 찾기 예제의 귀중한 예입니다.

http://www.theunixschool.com/2012/07/find-command-15-examples-to-exclude.html

초기 질문에 연결하려면 finally 제외는 다음과 같이 저에게 효과적이었습니다.

find . -regex-type posix-extended -regex ".*def/incoming.*|.*456/incoming.*" -prune -o -print 

그런 다음 하나의 파일을 찾고 여전히 경로를 제외하려면 | grep myFile.txt.

또한 찾기 버전에 따라 다를 수 있습니다. 내가 참조:

$ find -version
GNU find version 4.2.27
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION SELINUX

5

-name전체 경로가 아닌 파일 이름 만 일치합니다. 당신은 사용할 -path당신이 좋아하는 디렉토리를 치기되는 부품 대신 def/incoming.


2
find $(INP_PATH} -type f -ls |grep -v "${INP_PATH}/.*/"

7
일부 설명은 이것을 훨씬 더 나은 답변으로 만들 수 있습니다.
Cris Luengo

제한된 단기 도움을 제공 할 수있는이 코드 스 니펫에 감사드립니다. 적절한 설명은 이것이 문제에 대한 좋은 해결책 인 이유를 보여줌으로써 장기적인 가치를 크게 향상시키고 다른 유사한 질문을 가진 미래의 독자에게 더 유용하게 만들 것입니다. 당신이 만든 가정을 포함하여 몇 가지 설명을 추가 할 답변을 수정하십시오
숀 C.

1
참고 :이 트릭은 find ... -print0나중과 함께 사용 하는 경우 작동하지 않습니다xargs -0
phs

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.