가장 작은 번호가 매겨진 하위 디렉터리 찾기

가장 작은 번호가 매겨진 하위 디렉터리 찾기

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

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

/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그런 다음 찾은 항목을 정렬하고 -n20이 100보다 앞에 오도록 숫자로 처리하십시오.

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

마지막으로 SUBDIRLIST=10?명령문은 10으로 시작하고 이름에 세 문자가 포함된 하위 디렉터리만 선택합니다. 필요한 만큼 제한할 수 있습니다. 예를 들어 SUBDIRLIST=*Select Everything은 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

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

관련 정보