가장 낮은 번호의 모든 하위 디렉터리를 나열하려고 합니다.
예를 들어 다음 목록의 경우:
/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으로 시작하고 이름에 세 문자가 포함된 하위 디렉터리만 선택합니다. 필요한 만큼 제한할 수 있습니다. 예를 들어 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
참고: 두 번째 디렉터리의 번호가 다른 경우 이 스크립트는 실패합니다.