[unix] 찾기에서 디렉토리 제외

find?를 사용하여 하나의 디렉토리를 제외하고 패턴과 일치하는 모든 파일과 디렉토리를 어떻게 찾을 수 있습니까?

다음과 같은 파일 구조가 있다고 가정하십시오.

.
  foo-exclude-me /
    foo.txt
  foo-exclude-me-not /
    foo.txt
  바/
    foo.txt
    foobar /
      bar.txt
      foofoo.txt

사용하여 다음과 같은 출력을 얻는 방법은 무엇입니까 find?

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

다음 명령을 모두 사용해 보았습니다.

찾기 . -name 'foo-exclude-me'-prune -o -name 'foo *'
찾기 . -이름 'foo *'\! -경로 './foo-exclude-me/*'

그러나 둘 다 이것을 반환합니다.

./bar/foo.txt
./bar/foobar
./bar/foobar/foofoo.txt
./foo-exclude-me # << this should be excluded
./foo-exclude-me-not
./foo-exclude-me-not/foo.txt

foo-exclude-me디렉토리를 올바르게 제외하려면 어떻게 해야합니까?



답변

find . -name 'foo-exclude-me' -prune -o -name 'foo*' -print

no -print를 사용하면 내재 된 기본 동작이 제거 된 모든 일치 항목에도 적용됩니다. 명시 -print적은 지정된 조건 하에서 만 적용되며 -name 'foo*'의 else 분기에만 -name 'foo-exclude-me'있습니다.

일반적으로, -print술어 결합보다 복잡한 작업을 수행 할 때마다 명시 적으로 사용하십시오 .

일치하지 않기 ! -path './foo-exclude-me/*'때문에 두 번째 시도가 작동 ./foo-exclude-me하지 않았습니다 ./foo-exclude-me/*(후행 없음 /). 추가하면 효과 ! -path ./foo-exclude-me가 있습니다.


답변

-bash-4.1 $ 찾기 -exec ls -l {} + -name 'a.out'-prune -o -name '*'-exec rm -f {} + -exec ls -l {} +

-rw-r--r--. 1 oradba dba 499 Jan 18 19:30 ./a.out
-rw-r--r--. 1 oradba dba 499 Jan 18 20:59 ./b.out
-rw-r--r--. 1 oradba dba 499 Jan 18 20:59 ./c.out
-rw-r--r--. 1 oradba dba 499 Jan 18 20:59 ./d.out

. :
총 16
-rw-r--r--. 1 oradba dba 499 1 월 18 일 19:30 a.out
-rw-r--r--. 1 oradba dba 499 1 월 18 일 20:59 b. 아웃
-rw-r--r--. 1 oradba dba 499 1 월 18 일 20:59 c.out
-rw-r--r--. 1 oradba dba 499 1 월 18 일 20:59 d.out
rm :`. '을 (를) 제거 할 수 없습니다 : 디렉토리입니다
ls : ./b.out에 액세스 할 수 없음 : 해당 파일 또는 디렉토리가 없습니다.
ls : ./d.out에 액세스 할 수 없음 : 해당 파일 또는 디렉토리가 없습니다.
ls : ./c.out에 액세스 할 수 없음 : 해당 파일 또는 디렉토리가 없습니다.
. :
총 4
-rw-r--r--. 1 oradba dba 499 1 월 18 일 19:30 a.out


답변