검색에서 모든 하위 디렉터리 제외

검색에서 모든 하위 디렉터리 제외

폴더의 일부 파일을 보고 싶지만 하위 디렉터리는 보고 싶지 않습니다.

디렉토리를 제외하고 싶지는 않지만모두!

나는 이것을 시도했다~에서

find "$dir" -name '*.out' -type d -prune

그러나 결과는 아무것도 나오지 않는다는 것입니다. 도움이 필요하세요?

답변1

작업(모든 하위 디렉터리를 제외한 폴더에서 파일 찾기)을 수행하는 가장 쉬운 방법은 다음과 같습니다.

find $dir -maxdepth 1 -type f -name '*.out' -o '.*.out'

@StevenPenny와 @RalfFriedlal이 쓴 것처럼 maxlength 옵션이 여러분이 찾고 있는 것입니다.

찾기 매뉴얼에서: -max 깊이 수준은 시작점 아래의 대부분의 (음수가 아닌 정수) 디렉터리 수준으로 내려갑니다. -maxlength 0은 시작점 자체에만 테스트와 작업을 적용한다는 의미입니다.

-type f : 일반 파일을 검색하고 있습니다 -name '*.out' -o '.*.out' . -o는 또는 검색에 .out 확장자를 가진 최종 숨김 파일을 포함할 수 있음을 의미합니다.

죄송합니다. 제 영어 실력이 좋지 않습니다.:(

답변2

설명서를 보고 시도해 보셨나요?

-maxdepth@StevenPenny가 이미 작성한 것처럼 당신이 찾고 있는 옵션은 입니다 .

아무것도 얻지 못하는 이유 중 하나는 (설명서에서)

전체 표현식에 -prune 또는 -print 이외의 작업이 포함되어 있지 않으면 전체 표현식이 true인 모든 파일에 대해 -print가 수행됩니다.

따라서 귀하의 선택이 포함되어 있으므로 -prune아무 것도 암시되지 않습니다 -print. 귀하의 명령은 이름이 지정된 디렉터리만 삭제합니다 *.out.

정말로 사용하고 싶다면 -prune다음을 수행하십시오.

find "$dir"/* -type d -prune -o -name '*.out' -print

이는 디렉토리 "$dir"/*로 사용되며 "$dir"정리됩니다. 이는 find최대 매개변수 길이에 의해 제한되지 않는다는 이점을 무효화합니다.

답변3

find여기서는 실제로 이것이 전혀 필요하지 않은 것 같습니다 .

for pathname in "$dir"/*.out; do
    [ ! -f "$pathname" ] && continue

    # do whatever you need to do to "$pathname" here
done

테스트 후에는 -f일반 "$pathname"파일이나 일반 파일에 대한 심볼릭 링크를 가리킵니다. *점으로 시작하는 파일 이름과 일치하는 항목이 없기 때문에 숨겨진 파일은 건너뜁니다 ( 사용할 수도 있고 사용하지 않을 수도 있는 dotglob쉘 옵션이 에 설정되지 않은 경우).bash

그리고 find:

find "$dir" -mindepth 1 -type d -prune -o -type f -name '*.out' -print

이로 -mindepth 1인해 시작 디렉토리가 정리되지 않습니다 -type d -prune. -print는 발견된 경로 이름에 대해 수행하려는 작업으로 대체되어야 합니다 (이것은 이름이 로 끝나는 일반 파일입니다 .out).

또는,

find "$dir" ! -path "$dir" -type d -prune -o -type f -name '*.out' -print

이는 표준 find옵션만 사용하고 시작 경로와 다른 모든 디렉터리를 정리합니다.

또는,

find "$dir" -maxdepth 1 -type f -name '*.out' -print

-maxdepth 1find더 간단히 말하면, 사용은 시작 디렉터리의 하위 디렉터리로 내려가는 것을 중지합니다 .

-mindepth및 옵션은 -maxdepth일반적으로 사용 가능하지만표준 find명령, 구현에 find이러한 항목이 없으면 쉘 루프나 (with )만 find사용하는 대안을 사용해야 합니다.-prune-path

답변4

그리고 zsh:

printf '%s\n' $dir/*.out(^/)  # files of any type except directory (excluding
                              # hidden ones)
printf '%s\n' $dir/*.out(-^/) # same but also excludes symlinks to directories
printf '%s\n' $dir/*.out(.)   # regular files only (excluding hidden ones)
printf '%s\n' $dir/*.out(-.)  # regular files or symlinks to regular files
                              # (excluding hidden ones)
printf '%s\n' $dir/*.out(D-.) # same, but include hidden ones.

관련 정보