이 문자 집합으로 끝나지 않는 모든 하위 디렉터리에서 이 문자 집합으로 끝나는 모든 파일을 나열합니다.

이 문자 집합으로 끝나지 않는 모든 하위 디렉터리에서 이 문자 집합으로 끝나는 모든 파일을 나열합니다.

다음으로 끝나는 파일을 어떻게 나열하시겠습니까?x, y 또는 z다음으로 끝나지 않는 하위 디렉터리에서x, y 또는 z?

답변1

드롭을 완전히 방지 하고 *[xyz]깊이가 2인 일반 파일(예: find a/x, nor ax/xnor , 두 디렉터리를 넘지 않음)의 경우 a/bPOSIXly :xa/b/x

LC_ALL=C find . \( ! -name '*[xyz]' -o -prune \) \
  -path './*/*' -prune -type f -name '*[xyz]'

이는 다음과 같습니다.

printf '%s\n' *[!xzy]/*[xyz]

무엇보다도 숨겨진 디렉터리와 숨겨진 파일을 찾고 디렉터리에 대한 심볼릭 링크는 찾지 않고 일반 파일만 찾습니다.

*[xyz]어떤 깊이의 일반 파일도 찾고 싶다면직접상위 디렉토리는 GNU로 끝나지 않습니다 xyz(따라서 x, a/x, a/b/x는 발견되지만 nor 는 x/b/x발견되지 않음 ) .x/xa/x/xfind

LC_ALL=C find . -regex '.*[^xyz]/[^/]*[xyz]' -type f

그리고 zsh:

setopt extended_glob
printf '%s\n' **/*[xzy]~*[xyz]/[^/]#(D.)

POSIX적으로:

LC_ALL=C find . -name '*[xzy]' -type f -exec sh -c '
  for f do
    case ${f%/*} in
      *[xzy]) ;;
      *) printf '%s\n' "$f"
    esac
  done' sh {} +

하위 디렉토리에서도 내부를 전혀 보고 싶지 않은 경우 *[xyz](즉, 보고 싶지 않은 경우 x/a/x) 다음과 같습니다.

find . -name '*[xyz]' -prune -type f

-prunefind디렉터리에 들어가지 말라고 지시 하고 true를 반환합니다.

또는 다음을 사용하여 zsh:

setopt extended_glob
printf '%s\n' (*[^xyz]/)#*[xyz](D.)

답변2

1

다음의 파일에만 사용할 수 있습니다.모두임의 깊이의 하위 디렉터리:

(스티븐 체이저러스 이후)

 find . -name '*[xyz]' -prune -type f

2

깊이가 2인 하위 디렉터리에만 있는 파일의 경우 다음을 시도해 보세요.

(비표준 옵션도 포함합니다. 아직은 대략적인 이해로 생략을 잘 못합니다. 자세한 내용은 댓글을 참고해주세요.)

find . -mindepth 2 -maxdepth '2' -wholename "./*[^xyz]/*[xyz]" -type f 2>/dev/null

find파일 찾기

.find가 현재 디렉터리에서 시작하도록 지시

-mindepth 2검색이 현재 디렉터리 1레벨 깊이부터 시작되어야 함을 나타냅니다.

-maxdepth 2검색이 현재 디렉터리보다 한 수준 더 깊게 종료되어야 함을 나타냅니다.

-wholename파일 경로 정의 값 ./*[^xyz]/*[xyz]은 질문에서 정의한 것입니다.

-type ffind에게 파일만 찾도록 지시

2>/dev/null오류 메시지를 인쇄하지 않도록 찾기에 지시

파일뿐만 아니라 디렉터리도 원하는 경우 다음이 더 쉽습니다.

ls -d *[^xyz]/*[xyz]

ls파일과 디렉터리를 나열하는 데 사용됩니다.

ls -d디렉토리에 콘텐츠를 표시하지 않는 ls옵션 포함-d

고쳐 쓰다

파일 확장자를 포함하지 않고 파일 이름 끝으로 검색 기준을 변경하는 방법이 궁금합니다. 검색하면 파일이 표시됩니다file.ab 대신 .abc

그러면 현재 디렉토리에 목록이 표시됩니다.

ls -d *[xyz].???

Linux에서는 생각하는 것처럼 파일에 확장자가 없습니다. 확장자는 파일 이름의 일부입니다. 이전 명령, 특히 첫 번째 명령을 모두 다시 작성하는 것은 약간 복잡합니다.

1.

(지금까지 생각해낸 것 중 최고입니다.)

find . -path '.*[^xyz]/*[xyz].???' -type f | grep -v [xyz]/

2.

find . -mindepth 2 -maxdepth '2' -wholename "./*[^xyz]/*[xyz].???" -type f 2>/dev/null

삼.

ls -d *[^xyz]/*[xyz].???

관련 정보