하위 디렉터리를 제외한 디렉터리 경로로 파일 찾기

하위 디렉터리를 제외한 디렉터리 경로로 파일 찾기

find이것을 사용 하여 디렉토리를 순회하지만 하위 디렉토리로 재귀하지 않으려면 어떻게 해야 합니까 ?

나는 그것을 시도했지만 -prune작동하지 않습니다. 선택의 여지가 없다 -maxdepth.

find /opt/projectname/bin -type f /opt/projectname/bin -prune -o -print
find: missing conjunction
/opt/projectname/bin/file_1_is_printed
/opt/projectname/bin/file_2_is_printed
/opt/projectname/bin/directory_within_bin/some_file_should_not_be_printed
/opt/projectname/bin/directory_2_within_bin/some_file_2_should_not_be_printed

/usr/bin/find:
         find.c $Date: 2011/08/12 15:04:36 $Revision: r11.31/4 PATCH_11.31 (PHCO_42158)
         libcpio.c $Date: 2008/05/27 16:08:10 $Revision: r11.31/2 PATCH_11.31 (PHCO_36666)
         $Revision: @(#) find R11.31_BL2011_0923_2 PATCH_11.31 PHCO_42158

이 질문은 중복되지 않습니다. 여기에는 GNU가 없습니다. 이 질문이 중복될 수 있지만 이러한 질문에 대한 답변을 얻으려면 모두 GNU 도구를 설치해야 합니다. 따라서 여기에 있는 답변이 문제 해결에 도움이 된다면 이것은 독특한 스레드입니다.

답변1

질문의 명령이 실제로 입력한 것이라고 가정하면 find작업과 디렉터리 검색 루트가 혼합되어 오류 메시지가 표시됩니다.

내 제안은 다음을 기반으로합니다.이 HP UX 매뉴얼 페이지find, 귀하의 '아니요-maxdepth"성명.

다음 변형을 시도해 보세요.

find /opt/projectname/bin -path '/opt/projectname/bin/*/*' -prune -o -type f -print

디렉토리에 "너무 많은" 파일이 없다는 것을 알았다면 실제로 이 "더 깔끔한" 대안을 고려할 것입니다. 그러나 귀하의 경우에는 다음을 받아들이지 못할 수도 있습니다.

find /opt/projectname/bin/* -type f -print -o -prune

답변2

"접속사 누락" 오류는 나중에 디렉터리 이름을 반복했는데 이를 구문 분석하는 방법을 모르기 때문에 발생 -type f합니다 find.

하위 디렉터리 순회를 방지하려면 일반 파일이 아닌 디렉터리를 정리해야 합니다. 그러나 시작 디렉터리를 정리할 수는 없습니다. 그렇지 않으면 find해당 디렉터리 외에는 아무것도 처리되지 않습니다. 시작 디렉토리를 식별하는 쉬운 방법은 이름을 ..

find /opt/projectname/bin/. -name . -o -type d -prune -o -print

설명하다:

  • -name ..— [아무 것도 하지 않음] 이름이 다음과 같은 경우
  • 그렇지 않은 경우: -type d— 파일이 디렉토리인 경우 입력하지 마십시오.
  • 그렇지 않은 경우: 인쇄 경로

답변3

오늘 이 문제로 어려움을 겪고 있으며 많은 조사와 테스트를 수행했지만 해결책을 찾았습니다.하다아니요무시해야 하는 각 개별 하위 디렉터리를 지정해야 합니다.(노트아래에,dir-name 할 수 있는.. )

$ find  dir-name/*  -name file-name  -print  -o -prune

.예를 들어 파일을 찾아야 하는 경우 .login명령은 다음과 같아야 합니다.

$ find  dir-name/.*  -name .file-name  -print  -o -prune

-exec찾은 파일을 삭제하는 등의 작업을 수행해야 하는 경우 다음 for-do 루프가 필요한 것 같습니다.

$ for  FILE  in  $( find  dir-name/*  -name file-name  -print  -o -prune )
do
    echo  "Removing  $FILE"
    rm  -f  $FILE
done

: 특히 HP-UX-11.31의 Korn-shell용입니다.

하위 디렉터리를 피하기 위해 더 간단한 구문을 사용하는 Linux에서는 필요하지 않습니다. HP-UX 외에도 Linux가 아닌 다른 Nix 변형에서도 작동할 수 있지만 저는 HP-UX만 테스트했습니다.

답변4

여기에 필요한 것은 더 많은 GNU -mindepth 1 -maxdepth 1(보통은 그렇지 않음)와 이에 상응하는 표준입니다.

find /path/to/dir -mindepth 1 -maxdepth 1 ...

실제로 더 짧습니다:

find /path/to/dir/. ! -name . -prune ...

여기 있어요치다트리의 루트를 제외한 모든 항목과 트리의 루트도 제외합니다. 는 false이기 때문에 사용 ! -name .되지 않는 한 나머지는 건너뜁니다..-o

주의할 점 세 가지:

  1. 심볼릭 링크인 경우 동일하지 않습니다. /path/to/dir이 경우 두 번째 링크는 옵션을 전달하는 것과 비슷 -H하지만 첫 번째 링크는 링크에서 중지됩니다.
  2. 파일 경로가 /path/to/dir/./file/within대체됩니다 /path/to/dir/file/within.
  3. 위에서 암시했듯이 조심해야 합니다 -o. 예를 들어 so print (so not ) find /path/to/dir/. ! -name . -prune -type l -o -type d로 해석됩니다 . 당신은 그것을 쓰고 싶습니다: 보고만 .find /path/to/dir/. '(' ! -name . -prune -type l ')' -o -type d/path/to/dir/.-mindepth 1find /path/to/dir/. ! -name . -prune '(' -type l -o -type d ')'/path/to/dir

find요즘 대부분의 구현은 -path원래 BSD에서 왔으며 결국 POSIX에서 지정하는 조건자를 지원하므로 다음을 사용하여 처음 두 가지 사항을 해결할 수 있습니다.

find /path/to/dir ! -path /path/to/dir -prune ...

하지만 매개변수는 -path패턴으로 간주되므로 임의의 디렉터리 경로에 사용할 수 있습니다. 예를 들면 다음과 같습니다.

"$dir"을 찾았습니다! -경로 "$dir" -트림...

보다 일반적으로 GNU 표준에 해당하는 내용은 -maxdepth n다음을 참조하세요.POSIX 조회를 특정 깊이로 제한하시겠습니까?.

관련 정보