가장 낮은 번호의 하위 디렉터리 찾기

가장 낮은 번호의 하위 디렉터리 찾기

가장 낮은 번호의 모든 하위 디렉터리를 나열하려고 합니다.

예를 들어 다음 목록의 경우:

/100/2001  
/100/2003  
/101/2001  
/101/2004  
/102/2000  
/102/2003  
/102/2005  

나는 다음만을 얻으려고 합니다:

/100/2001  
/101/2001  
/102/2000

답변1

각 디렉터리의 가장 낮은 디렉터리에 대해 각 디렉터리의 출력을 정렬해야 합니다.

/100/2001
/100/2003
/101/2001
/101/2004
/102/2000
/102/2003
/102/2005

ls 명령은 자동으로 이를 수행하지만 기본적으로 영숫자 정렬을 수행합니다. 모든 하위 하위 디렉터리의 이름이 동일한 길이라면 허용됩니다.

SUBDIRLIST=10? for SUBDIR in $SUBDIRLIST do ls -d $SUBDIR/???? | head -1 done

작동 방식: for SUBDIR in $SUBDIRLIST
목록의 각 디렉터리를 살펴보세요. 목록은 이전 줄에 정의되어 있습니다. 나는 10을 사용하기로 결정 했습니까? 3자 길이의 항목을 선택하고 10으로 시작하지만 SUBDIR=*모든 항목을 사용하고 싶다면 말할 수도 있습니다 .

ls -d $SUBDIR/????

  • ls$SUBDIR 내용의 정렬된 항목을 표시하는 명령
  • ????4자 길이의 항목만 선택합니다 . 상관하지 않으면 *를 선택하거나 무시해야 하는 다른 디렉토리가 있는 경우 다음과 같은 표현식을 사용하여 추가로 제한할 수 있습니다.20??

| head -1 - "head 명령"을 통해 목록을 전달합니다. - Head는 첫 번째 줄만 표시하고 나머지는 삭제합니다.

모든 디렉토리 이름의 길이가 같지 않으면 약간 다른 솔루션이 필요합니다. 예:
SUBDIRLIST=10? for SUBDIR in $SUBDIRLIST do find $SUBDIR -depth 1 | sort -n | head -1 done

이 경우 ls가 항목을 정렬하기 때문에 find를 사용하지만 잘못 수행되므로 중복됩니다. 찾기는 항목을 정렬하지 않습니다(기본값).

sort -n그런 다음 발견된 항목을 정렬하여 -n숫자로 처리되어 20이 100 앞에 오도록 합니다.

다시 한 번 head -1첫 번째 줄을 제외한 모든 항목을 삭제합니다.

그리고 마지막으로 SUBDIRLIST=10?명령문은 10으로 시작하고 이름에 3개의 문자가 있는 하위 디렉터리만 선택합니다. 필요에 따라 어느 정도 제한할 수 있습니다. 예를 들어 SUBDIRLIST=*모든 항목을 선택하면 SUBDIRLIST=???세 문자가 있는 항목을 모두 선택합니다.

답변2

이렇게 하면 트릭을 수행할 수 있습니다.

ls -1d /*/200{0,1}

출력:

/100/2001
/101/2001
/102/2000

답변3

이 입력의 경우 다음을 사용하여 수행할 수 있습니다.

awk -F/ 'min[$2]==0 { min[$2]=$3; next; }; 
 { if (min[$2]>$3) min[$1]=$3;}; 
 END {for (val in min) { print "/" val "/" min[val] };}'

awk첫 번째 필드를 기준으로 정렬합니다. 이것이 보장된 것인지 아니면 단지 우연의 일치인지는 모르겠습니다. awk 출력을 다음으로 파이프할 수 있는지 확인하십시오.

sort --field-separator=/ -n

답변4

이 같은?

for firstdir in `ls .`; do
  seconddir=`ls -1 ./$firstdir | head -n 1`
  echo $firstdir/$seconddir
done

참고: 두 번째 디렉터리의 숫자가 다른 경우 이 스크립트는 실패합니다.

관련 정보