가장 낮은 번호의 모든 하위 디렉터리를 나열하려고 합니다.
예를 들어 다음 목록의 경우:
/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
참고: 두 번째 디렉터리의 숫자가 다른 경우 이 스크립트는 실패합니다.