하위 디렉터리를 포함하지 않는 디렉터리 찾기

하위 디렉터리를 포함하지 않는 디렉터리 찾기

제가 작성한 스크립트는 ksh입니다. 파일만 포함하고 하위 디렉터리는 포함하지 않는 현재 디렉터리 아래에서 직접 모든 디렉터리 이름을 찾아야 합니다.

나는 첫 번째 필드( 디렉터리의 경우) ls -alR에 있는 첫 글자의 출력을 사용하고 재귀적으로 구문 분석 할 수 있다는 것을 알고 있습니다. 나는 이것이 분석하고 찾는 가장 좋은 방법이라고 d생각합니다 .awk

예를 들어 ls -al현재 디렉터리의 간단한 출력은 다음과 같습니다.

   drwxr-xr-x  22 af      staff    748 18 Mar 22:21 .
   drwxr-xr-x   5 root    admin    170 17 Mar 18:03 ..
   -rw-------   1 af      staff      3 17 Mar 16:37 .CFUserTextEncoding
   drwxr-xr-x   5 af      staff    170 17 Mar 17:12 Public
   drwxr-xr-x   9 af      staff    306 18 Mar 17:40 Sites
   -rw-------   1 af      staff      3 17 Mar 16:37 textd

Public이 출력에는 및 2개의 디렉터리가 있습니다 Sites. 디렉터리에는 Public하위 디렉터리가 없지만 Sites포함되어 있습니다. 그 안에는 3개의 하위 디렉토리가 있습니다 Sites. 따라서 디렉터리가 없는 디렉터리만 에코하면 됩니다. 제가 아는 한은 그저 그렇습니다 Sites.

답변1

find"일반 Unix 파일 시스템"(예 :찾기(1)아래에-잎이 없다옵션 설명) 다음 명령을 사용할 수 있습니다.

find . -type d -links 2

각 디렉토리에는 최소한 2개의 이름(하드 링크) .과 해당 이름이 있습니다. 해당 하위 디렉터리(있는 경우)는 상위 디렉터리를 가리키 ..므로 N개의 하위 디렉터리가 있는 디렉터리의 하드 링크 수는 N+2입니다. 따라서 하드링크 수가 2인 디렉토리를 검색할 때 하위 디렉토리가 N=0인 디렉토리를 검색합니다.

따라서 이것은 사용할 수 있는 경우 가장 빠른 방법일 수 있으며 find각 구성원의 디렉터리 내용에 대해 셸 내부를 반복하는 것보다 훨씬 낫습니다.stat()

답변2

*/현재 디렉터리의 하위 디렉터리와 일치합니다. 여기에는 원할 수도 있고 원하지 않을 수도 있는 디렉토리 심볼릭 링크가 포함됩니다.

ksh93에서 ~(N)패턴 시작 부분에 추가하면 일치하는 항목이 없는 경우 빈 목록으로 확장됩니다. 이것이 없으면 일치하는 항목이 없으면 패턴이 변경되지 않습니다.

다음 ksh93 함수는 하위 디렉터리나 디렉터리 링크를 포함하지 않는 현재 디렉터리 내의 하위 디렉터리를 나열합니다.

list_leaf_directories () {
  local FIGNORE='.?(.)'        # don't ignore dot files
  local d
  for d in */; do
    [[ -L $d ]] || continue;   # skip symbolic links
    set -- ~(N)"$d"/*/
    if ((!$#)); then echo "$d"; fi
  done
done

답변3

awk전혀 사용할 필요가 없습니다. 제공된 내장 테스트를 ksh다음과 같이 사용하세요.

#!/bin/ksh

for NAME in *
do
    FOUND=no
    if [[ -d $NAME && $NAME != '.' && $NAME != '..' ]]
    then
        for SUBNAME in $NAME/*
        do
            if [[ -d $SUBNAME ]]
            then
                FOUND=yes
                break
            fi
        done
        if [[ $FOUND == no ]]
        then
            echo Found only files in $NAME
        fi
    fi
done

이 작은 스크립트는 현재 디렉터리의 모든 디렉터리를 찾아서 해당 디렉터리에 파일만 포함되어 있고 하위 디렉터리는 없는지 알려줍니다.

답변4

제가 잘못 이해한 것이 맞다면, 하위 디렉터리가 아닌 디렉터리에서만 파일을 찾으려는 것입니다. 이것이 당신의 의도라면 이것이 해결책입니다

find . -type f

일반 파일이 아닌 파일(예: 블록 장치 파일, 문자 장치 파일 등)을 찾으려면 find해당 명령의 매뉴얼 페이지를 참조하여 다음을 찾으십시오.유형이 페이지의 키워드입니다. 일반 파일, 디렉터리 등을 포함한 다양한 파일 형식이 표시됩니다.

이것이 당신이 찾고 있는 것이기를 바랍니다.

관련 정보