하위 디렉터리의 파일이 상위 디렉터리의 파일보다 먼저 나열되도록 파일 이름 목록을 정렬합니다.

하위 디렉터리의 파일이 상위 디렉터리의 파일보다 먼저 나열되도록 파일 이름 목록을 정렬합니다.

다음과 같은 파일 목록이 포함된 텍스트 파일이 있습니다.

file
A1/file
A1/B1/file
A2/file

하위 디렉터리의 파일이 상위 디렉터리의 다른 파일보다 먼저 나열되도록 정렬하려면 어떻게 해야 합니까?

A1/B1/file
A1/file
A2/file
file

답변1

간단한 방법은 다음과 같습니다.

awk 'BEGIN{FS="/"; OFS="\t"}{print NF, $0}' file | sort -rn | cut -f2-

A1/B1/file
A2/file
A1/file
file

문제와 같은 간단한 경우에 작동합니다.

디렉토리별로 정렬하려는 경우:

awk 'BEGIN{FS="/"; OFS="\t"}{print NF, $0}' file | sort -k1,1rn -k2 | cut -f2-

A1/B1/file
A1/file
A2/file
file

답변2

zshrder glob 확장자가 epth-first 인 odglob 한정자 ,od

$ print -rC1 -- **/file(Nod)
A2/file
A1/B1/file
A1/file
file

파일 목록이 한정자를 사용하여 전역 확장에 로드되면 임의의 파일 목록에 적용될 수 있습니다 e.

$ print -rC1 -- /(Ne['reply=( ${(f)"$(<your-file)"} )']od)
A2/file
A1/B1/file
A1/file
file

이름별로 정렬 on:

$ print -rC1 -- /(Ne['reply=( ${(f)"$(<your-file)"} )']odon)
A1/B1/file
A1/file
A2/file
file

답변3

@Kusalananda의 통찰력을 확장하기 위해 이러한 파일 이름이 실제로 기존 디렉토리 트리의 전체 내용인 경우 find원하는 것을 수행할 수 있습니다.

반면:

$ find .
./f2
./A1
./A1/B1
./A1/B1/f2
./A1/B1/f1
./A1/f2
./A1/f1
./A2
./A2/B1
./A2/B1/C1
./A2/B1/C1/f2
./A2/B1/C1/f1
./A2/f2
./A2/f1
./f1

GNU는 다음을 find수행할 수 있습니다.

$ find . -depth -type d -exec find {} -maxdepth 1 -not -type d \;
./A1/B1/f2
./A1/B1/f1
./A1/f2
./A1/f1
./A2/B1/C1/f2
./A2/B1/C1/f1
./A2/f2
./A2/f1
./f2
./f1

디렉토리의 파일 순서에 관심이 있다면 GNU find는 순서를 제어할 수 없기 때문에 실망할 것입니다. 다음과 같은 작업을 수행해야 할 수도 있습니다.

$ find . -depth -type d -exec sh -c 'find {} -maxdepth 1 -not -type d | sort' \;
./A1/B1/f1
./A1/B1/f2
./A1/f1
./A1/f2
./A2/B1/C1/f1
./A2/B1/C1/f2
./A2/f1
./A2/f2
./f1
./f2

FreeBSD 및 NetBSD의 유틸리티는 파일 이름별로 정렬된 플래그를 find인식합니다 .-s

$ find . -depth -type d -exec find -s {} -maxdepth 1 -not -type d \; 
./A1/B1/f1
./A1/B1/f2
./A1/f1
./A1/f2
./A2/B1/C1/f1
./A2/B1/C1/f2
./A2/f1
./A2/f2
./f1
./f2

@StéphaneChazelas가 주석에서 지적했듯이 -sOpenBSD에서는 이 플래그를 사용할 수 없습니다. 사용 가능한 경우에도 find -s매뉴얼 페이지에 명시된 대로 로케일 등에 따라 충돌이 발생할 수 있습니다.

참고: 'find -s' 및 'find | sort'는 다른 결과를 제공할 수 있습니다.

관련 정보