다음과 같은 파일 목록이 포함된 텍스트 파일이 있습니다.
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
zsh
rder glob 확장자가 epth-first 인 od
glob 한정자 ,o
d
$ 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가 주석에서 지적했듯이 -s
OpenBSD에서는 이 플래그를 사용할 수 없습니다. 사용 가능한 경우에도 find -s
매뉴얼 페이지에 명시된 대로 로케일 등에 따라 충돌이 발생할 수 있습니다.
참고: 'find -s' 및 'find | sort'는 다른 결과를 제공할 수 있습니다.