특정 하위 경로를 제외한 와일드카드 디렉터리에서 파일 찾기

특정 하위 경로를 제외한 와일드카드 디렉터리에서 파일 찾기

다음 디렉터리(및 파일) 구조를 고려하세요.

mkdir testone
mkdir testtwo
mkdir testone/.svn
mkdir testtwo/.git
touch testone/fileA
touch testone/fileB
touch testone/fileC
touch testone/.svn/fileA1
touch testone/.svn/fileB1
touch testone/.svn/fileC1
touch testtwo/fileD
touch testtwo/fileE
touch testtwo/fileF
touch testtwo/.git/fileD1
touch testtwo/.git/fileE1
touch testtwo/.git/fileF1

이 두 디렉터리에 있는 모든 파일을 인쇄/찾고 싶지만 하위 디렉터리 .git및/또는 .svn.

find test*

...그러면 모든 파일이 덤프됩니다.

내가 이렇게 하면(예를 들어,와일드카드가 포함된 찾기 검색에서 숨겨진 파일 및 디렉터리를 제외/무시하는 방법은 무엇입니까?):

$ find test* -path '.svn' -o -prune 
testone
testtwo
$ find test* -path '*/.svn/*' -o -prune 
testone
testtwo

...그런 다음 덤프의 최상위 디렉토리만 가져오고 파일 이름은 가져오지 않습니다.

find파이핑 없이 이와 같은 검색/목록을 자체적으로 수행 할 수 있습니까 grep(예: find모든 파일에 대해 a를 수행한 다음: find test* | grep -v '\.svn' | grep -v '\.git'; 필요하지 않은 최상위 디렉터리 이름도 출력됩니다)?

답변1

명령은 find주어진 경로가 일치하지 않는 경우 수행할 작업을 말하지 않습니다. 점으로 시작하는 모든 것을 제외하고 나머지를 인쇄하려면 다음을 시도하십시오.

find test* -path '*/.*' -prune -o -print

따라서 해당 경로와 일치하는 모든 항목을 제거하고 일치하지 않는 항목을 인쇄합니다.

출력 예:

testone
testone/fileC
testone/fileB
testone/fileA
testtwo
testtwo/fileE
testtwo/fileF
testtwo/fileD

점으로 시작하는 콘텐츠만 제외하고 다른 내용은 제외하려면 다음을 수행하세요 .svn..git

find test* \( -path '*/.svn' -o -path '*/.git' \) -prune -o -print

이 예에서는 동일한 출력이 생성됩니다.

최상위 디렉토리를 제외하려면 -mindepth 1다음과 같은 것을 추가할 수 있습니다.

find test* -mindepth 1 -path '*/.*' -prune -o -print

이것은 만든다

testone/fileC
testone/fileB
testone/fileA
testtwo/fileE
testtwo/fileF
testtwo/fileD

답변2

Eric의 답변을 보완하기 위해 연산자를 find사용하여 조건자를 뒤집을 수 있습니다 . 경로를 포함하여 파일에 대해 일치를 수행하는 테스트 !도 있습니다 . -wholename따라서 다음과 같이 작성할 수 있습니다.

find test* \( ! -wholename "*/.git/*" -a ! -wholename "*/.svn/*" \)

관련 정보