리눅스에서 파일을 찾고 특정 디렉토리를 제외


14

다음과 같은 결과가 있습니다.

rm -f crush-all.js
find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | while read line
do
   cat "$line" >> crush-all.js
   echo >> crush-all.js
done

찾기에서 "test"라는 디렉토리를 제외시키기 위해 추가하고 싶지만 어떻게 든 "-type d"를 추가하는 방법을 알 수없는 것 같습니다. 내가 어떻게 했어?

감사!

답변:


22

-path옵션을 사용 하여 -not연산자 를 찾아 조합 할 수 있습니다 .

find . ! -path "*/test/*" -type f -name "*.js" ! -name "*-min-*" ! -name "*console*"

두 가지 유의하시기 바랍니다

  • -path 첫 번째 논쟁으로 와야한다
  • 패턴은 전체 파일 이름과 일치하므로 -path test아무 것도 일치하지 않습니다.

그건 그렇고, 왜 당신이 괄호를 사용하는지 확실하지 않습니다, 그것은 차이가 없습니다. 그것은 단지 같은 구조를 위해, 우선 순위에 사용되는 ! \( -name '*bla*' -name '*foo*' \)(즉, 모두가 것들을 찾을 수없는 blafoo).

더 세분화 : bash 루프를 사용할 필요가 없으므로 간단히 할 수 있습니다.

find . ... -exec cat {} \; -exec echo \;

여기서 ...는 다른 인수 find입니다.


2
find / -path ./test -prune -o ...

./test테스트 디렉토리의 위치에 맞게 이름 을 바꾸십시오 .


2
이 경우, -o 옵션 다음에 -print 조치 추가 (-print가 기본 조치가 아니므로)를 잊지 마십시오
Bill Zhao

1

다음과 같이 grep을 사용해 볼 수 있습니다 (여기서 폴더 이름은 test_folder 임).

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/path/to/test_folder/" | while read line

또는 찾기가 상대 경로를 반환하는 경우 :

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "./relative_path/to/test_folder/" | while read line

또는 이름은 같지만 경로가 다른 모든 폴더를 원하는 경우

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) | grep -v "/test_folder/" | while read line

친애하는,


1

@CharlesClavadetscher그의 대답에 대한 생각을 넓히기 위해. 경로를 생략하면 경로 -not -path ... find가 계속 내려갑니다. 대신,를 사용 -prune하면 생략 된 경로로 더 내려가는 것을 막아 더 빠르게 만듭니다. 그래서 당신은 같은 것을 할 수 있습니다

find . -path '*test/*' -prune -o -type f -name "*.js" ! -name "*-min*" ! -name "*console*" -print

0

파일을 검색 할 때 "이름 없음"을 사용합니다. -name 은 실제 파일 이름을 테스트 하지만 -wholename 은 전체 경로를 테스트합니다. 따라서 위의 질문에 테스트 무시를 추가하십시오.

find . -type f \( -name "*.js" ! -name "*-min*" ! -name "*console*" \) ! -wholename "*test*"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.