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