포함 된 줄 수로 정렬 된 파일 나열


32

파일 /group/book/four/word의 줄 수를 포함 된 줄 수로 정렬하여 어떻게 나열 할 수 있습니까?

ls -l 명령은 그들을 나열하지만 정렬하지는 않습니다.


1
파일을 줄 수로 나열 하시겠습니까, 파일의 줄 수 또는 둘 다를 나열 하시겠습니까? ls -l줄 수를 제공하지 않습니다. ls -lS일부 ls구현 ( 크기 는 내용의 바이트 수)으로 파일을 크기별로 정렬합니다 .
Stéphane Chazelas

답변:


34

다음과 같은 명령을 사용해야합니다.

find /group/book/four/word/ -type f -exec wc -l {} + | sort -rn
  • find: 원하는 경로에서 파일을 검색하십시오. 재귀를 원하지 않고 find구현에서 지원하는 -maxdepth 1경우 -exec옵션 바로 앞에 추가해야합니다 .
  • exec: wc -l모든 파일 에서 실행되도록 명령에 지시 합니다.
  • sort -rn: 결과를 역순으로 정렬합니다. 더 큰에서 더 낮은로.

(파일 이름에 줄 바꿈 문자가 포함되어 있지 않다고 가정).


둘 이상의 파일 (또는 일부 구현에서는 읽을 수있는 둘 이상의 파일)을 전달할 때 wctotal줄 도 인쇄 되므로 하나의 파일이 없으면 하나 이상의 "총"줄이 표시됩니다. . 파이프를 grep /제거하여 제거 할 수 있습니다.
Stéphane Chazelas

sort명령으로 공감
Francisco

최소 X 줄의 파일 만 표시하도록 필터링하려면 어떻게해야합니까 (예 : X = 0 줄 제외)?
매트릭스

11

비 재귀

재귀가 필요없는 경우 아마도 가장 간단한 버전입니다.

wc -l /group/book/four/word/*|sort -n

wc카운트 라인 (옵션 -l마다의) (하지만 숨겨진) ( *)에서 파일 /group/book/four/word/sort(파이프를 통해 결과를 정렬 |) 수치 (옵션 -n).

재귀

누군가이 답변에 대해 언급 grep -rlc하기 전에을 언급 하기 전에 의견을 남겼 습니다. 실제로 grep재귀가 필요한 경우 특히 훌륭한 대안입니다.

grep -rc '^' /group/book/four/word/|tr ':' ' '|sort -n -k2

(옵션을 계산합니다 -c재귀 (옵션) -r) 라인 매칭 ( grep) '^'디렉토리에 (라인의 시작입니다) /group/book/four/word/. 그런 다음 콜론을 공백으로 대체해야합니다 (예 :을 사용 tr하여 help ). 두 번째 열 (옵션 ) 에서 sort숫자로 정렬하려면 -n(옵션 -k2)

업데이트 : 가능한 제한 사항과 실제로 제거하는 방법에 대한 Stephane의 의견을 참조하십시오 tr.


3
grep -c .유효한 문자가 하나 이상 포함 된 행을 계산합니다. grep -c '^'모든 줄을 세는 데 사용하십시오 (일부 grep구현 에서는 마지막 개행 뒤의 후행 문자도 계산 합니다). 모든 grep구현이 a를 지원하는 것은 아니며 -r동작 은 구현에 따라 다릅니다. :s (세미콜론이 아닌 콜론)를 공백 으로 변환 할 필요는 없습니다 sort. 그냥 사용하십시오 -t:. 파일 이름에 :공백이나 줄 바꿈 문자가 포함되어 있지 않다고 가정합니다 .
Stéphane Chazelas

1
비 재귀 솔루션을 게시 해 주셔서 감사합니다. wc여러 경로를 통과하면 편리한 총액을 모두 알 수 없었습니다 . 와일드 카드 및 파이프와의 기능 연결 sort은 정말 깨끗합니다.
Qcom

7

zsh:

lines() REPLY=$(wc -l < $REPLY)
printf '%s\n' /group/book/four/word/*(.no+lines)

파일의 줄 수에 응답 하는 새로운 정렬 함수 lines를 정의 합니다. 그리고 우리 o+linesn(숫자 정렬 과 함께 ) glob 결과가 정렬되는 방법을 정의하는 glob 한정자를 사용합니다 . ( .정규 파일 만 확인하기 위해 추가됨).

따라서 파일 이름에 숨겨진 파일 이외의 문자 (로 시작하는 문자)가 포함될 수 있다는 가정은 없습니다 .. D원하는 경우 glob 한정자를 추가하십시오 .


2
OP 태그 bash만 ...
l0b0

7
@ l0b0은 이것이 필요한 다음 사람이 bash를 실행한다는 것을 의미하지는 않습니다.
terdon

4

의 하위 디렉토리에 파일을 원하는지 여부를 지정하지 않습니다 /group/book/four/word. findjherran의 대답에 솔루션은 서브 디렉토리로 내려합니다. 원하지 않으면 대신 쉘을 사용하십시오.

for file in ./*; do [ -f "$file" ] && wc -l "$file"; done | sort -n

파일 이름에 줄 바꿈이 포함될 수 있으면 다음과 같이 사용할 수 있습니다.

for file in ./*; do 
    [ -f "$file" ] && 
        printf "%lu %s\0" "$(wc -l < "$file")" "$file"
done | sort -zn | tr '\0' '\n'

당신이 경우 마지막으로 하위 디렉토리로 하강 할을, 당신은이를 사용할 수 있습니다 bash4 위 :

shopt -s globstar
for file in ./**/*; do [ -f "$file" ] && wc -l "$file"; done | sort -n

참고 버전의 것을 bash반복적으로 (같은 디렉토리 트리를 내려 할 때 이전 4.3은 심볼릭 링크를 따라했다 zsh's 또는 tcsh***/*).

또한 위의 모든 솔루션은 숨겨진 파일 (이름이 a로 시작하고 포함하는 데 .사용 shopt -s dotglob되는 파일)을 무시 하고 심볼릭 링크의 줄 수 ( find접근 방식이 아닌)도 포함합니다.


jherran의 솔루션과 다른 차이점은 일반 파일 ( -xtype fGNU 찾기 또는 *(-.)zsh)에 대한 심볼릭 링크를 고려 하고 숨겨진 파일을 생략한다는 것입니다.
Stéphane Chazelas

@ StéphaneChazelas 감사합니다. 왜 %luprintf? 내가 기억 하듯이, 그것은 부호없는 긴 십진수를 의미합니다. 정말 필요합니까? 왜 숫자를 문자열로 취급하지 않습니까? 차이가 있습니까?
terdon

2
wc 출력이 비어 있으면 (예를 들어 파일을 읽을 수 없기 때문에) 0빈 문자열 대신 확장되어 약간 더 좋습니다. 일부 정렬 구현은 부호없는 정수로 작동하며 일부는 부호있는 정수로 작동합니다. %lu가장 안전한 내기처럼 들리지만 2^31라인 이있는 것처럼 중요하지 않을 수도 있습니다.
Stéphane Chazelas

1

설치하려는 경우 fd녹 작성된 정말 빠른 파일 찾기 (당신이 그것을 설치해야을, 어쨌든 가지고 좋아요)

fd --type=file . | xargs wc -l | sort -n

기본적으로 fd파일을 나열하면 xargs는 파일 목록을 전달합니다 wc(단어 수를 의미하지만 -l을 전달하면 행을 계산합니다). 마지막으로 최소 행 수에서 최대 행으로 정렬됩니다 sort -n.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.