
제가 작성한 스크립트는 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
해당 명령의 매뉴얼 페이지를 참조하여 다음을 찾으십시오.유형이 페이지의 키워드입니다. 일반 파일, 디렉터리 등을 포함한 다양한 파일 형식이 표시됩니다.
이것이 당신이 찾고 있는 것이기를 바랍니다.