정렬 된 하위 폴더의 내용을 포함하는 디렉토리에 파일 나열


9

하위 폴더의 내용을 포함하여 디렉토리의 전체 내용을 나열하려고하지만 파일 크기별로 정렬하려고합니다. 지금까지 나는 여전히 재귀 적 인 동안 목록 및 정렬까지 얻을 수있었습니다 ls -lhSR( h파일 크기를 얻을 수있는 한 가지고 있기는하지만 꼭 필요한 것은 아닙니다). 나는 명백한 것을 간과하거나 불가능한 것을 요구하고 있지만, 여기의 조언은 크게 감사하겠습니다.

답변:


15

당신은 찾기를 사용할 수 있습니다 :

find . -type f -printf "%s %P\n" | sort -n

선택 사항 : 바이트 값을 사람이 읽을 수있는 형식으로 변환하려면 다음을 추가하십시오.

| numfmt --to=iec-i --field=1

설명:

 find in current directory (.) all files (-type f) 

 -printf: suppress normal output and print the following:
     %s - size in bytes
     %P - path to file
     \n - new line

 | sort -n: sort the result (-n = numeric)

오 완벽 해! 정말 고마워요,이게 내가 필요한 걸 정확하게 했어요!
toms

3
내 대답이 도움이 되었기 때문에 기쁘다. 왼쪽의 확인 표시를 클릭하여 답변을 수락하십시오. 감사.
pLumo

1
@RoVo 또한 질문에 대한 답변을 주었을 때 흥미롭고 유용하다는 것을 알기 때문에 질문을 찬성하는 것도 좋을 것입니다.
terdon

이것은 실제로 사실이며 나는 지금 이것을했다 ;-)
pLumo

@toms이 답변만큼 좋은 경우에도 답변을 받기 위해 잠시 (어쩌면 하루 정도) 기다려도됩니다. 일단 답변이 수락되면 다른 답변이 더 나아질 방법이 없습니다. 그로 인해 많은 사람들이 다른 답변을 제출하지 않아도되므로 더 나은지 알 수있는 기회를 얻지 못합니다.
Monty Harder

7

특정 쉘을 지정하지 않았으므로 zsh의 glob 한정자를 사용하는 대안이 있습니다.

setopt extendedglob

재귀를 위해. 그런 다음 예를 들면 다음과 같습니다.

  1. 일반 파일을 재귀 적으로 나열하십시오.

    printf '%s\n' **/*(.)
  2. 재귀, 일반 파일 목록을 O를 하여 rdered 구김 L의 ength (즉, 크기) :

    printf '%s\n' **/*(.oL)
  3. 재귀 목록 일반 파일, O는 에 의해 rdered 주름 잡기의 크기 :

    printf '%s\n' **/*(.OL)
  4. 크기를 줄이면서 순서대로 일반 파일을 나열하고 상위 3 개의 결과를 선택하십시오.

    printf '%s\n' **/*(.OL[1,3])

파일 크기도 원하는 경우 사용할 수 있습니다.

du -hb **/*(.OL[1,3])

4

으로 globstar쉘 옵션을 설정하면 글 로빙 쉘을 사용할 수 있습니다 :

shopt -s globstar         # don’t match hidden files
shopt -s globstar dotglob # match hidden files
stat -c"%s %n" **/* | sort -n

너무 많은 파일로 시도하면 "인수 목록이 너무 깁니다"오류가 발생합니다. 그 해결하려면 사용할 수 있습니다 printfxargs:

printf "%s\0" **/* | xargs -0 stat -c"%s %n" | sort -n

방금 이것이 (4096 바이트 크기의) 디렉토리를 인쇄한다는 것을 깨달았습니다. 원치 않으면 이것을 대신 사용하십시오.

stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
printf "%s\0" **/* | xargs -0 stat -c"%A %s %n" | sed '/^d/d;s/\S* //' | sort -n

예제 실행

$ tree
.
├── edits.png
├── makescript
├── new
   └── edits.png
└── test
    └── 1.png

2 directories, 4 files
$ stat -c"%s %n" **/* | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png
4096 new
4096 test
$ stat -c"%A %s %n" **/* | sed '/^d/d;s/\S* //' | sort -n
0 test/1.png
43 makescript
2160 edits.png
2160 new/edits.png

좋은 해결책. 찾은 것과 비교하여 숨겨진 파일은 포함되어 있지 않습니다. 어떻게 달성합니까?
pLumo

@RoVo 항상 이것에 대해 잊어라 – dotglob쉘 옵션 을 설정하기 만하면된다 .
디저트

sed로 사실을 제거한 후 디렉토리를 제거하는 대신 다음과 같은 것을 고려할 수 있습니다.printf "%s\0" **/* | xargs -0 sh -c 'for f; do [ -d "$f" ] || stat -c "%s %n" "$f"; done' sh | sort -n
스틸 드라이버

ls -lhSd **/*디렉토리를 목록의 일부로 사용 하는 것이 마음에 들지 않으면 사용할 수 있습니다 . 디렉토리 이름의 아무도가없는 경우 또는 .그 (것)들에서, 당신이 원하는 모든 파일은 어떻게 당신이 할 수있는, ll -hS **/*.*또는 유사한.
Peter Cordes

로 그 살이 답변
피터 코르

3

zsh가없는 경우에도 du+를 사용할 수 있습니다 sort.

  1. 디렉토리의 누적 크기를 포함하여 사람이 읽을 수있는 크기 :

    du --apparent-size -ah0 . | sort -zh | xargs -0L1
    
  2. 파일 만 (을 사용하여 find) :

    find . -type f -print0 |
      du --files0-from=- --apparent-size -ah0 |
      sort -zh |
      xargs -0L1
    

두 경우 모두, 내가 사용하는 null로 끝나는 라인 (로 선택했다 -0, -z, -print0모든 유효한 파일 이름에 대한 안전을 위해, 옵션).


0

너무 크지 않은 디렉토리 트리에서 빠른 대화식 사용위해서는shopt -s globstar 정말 좋습니다. 글로브는 유형에 따라 디렉토리를 필터링 할 수 없습니다,하지만 당신은 그것을 사용하는 경우 ls -d다음 ls단지 대신 내용의 디렉토리 이름을 인쇄합니다.

ll별명에 다음이 포함되어 있다고 가정하십시오 -lh.

  # with  shopt -s globstar   in your .bashrc
ll -rSd **/*

내 코드 골프 디렉토리에서 이와 같은 출력을 제공하지만 색상 강조 표시를 사용하면 디렉토리를 쉽게 볼 수 있습니다. 파일 크기별 정렬은 하위 디렉토리에서 발생했습니다.

drwxr-xr-x 1 peter peter   70 Jun  8 07:56 casexchg
...
drwxr-xr-x 1 peter peter  342 Mar 13 18:47 parity-party
-rw-r--r-- 1 peter peter  387 Jul 29  2017 likely.cpp
-rw-r--r-- 1 peter peter  416 Aug 31  2017 true-binary.asm~
-rw-r--r-- 1 peter peter  447 Feb 23 20:14 weight-of-zero.asm
...
-rw-r--r-- 1 peter peter 6.4K Jun  1  2017 string-exponential.asm
-rwxr-xr-x 1 peter peter 6.7K Aug 31  2017 true-binary
-rwxr-xr-x 1 peter peter 6.8K Sep 17  2017 dizzy-integer
-rw-r--r-- 1 peter peter 7.5K Jul 24  2017 fibonacci/fibonacci-1G.v3-working-32b-stack-except-output.asm
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G~
-rw-r--r-- 1 peter peter 8.4K Jul 25  2017 fibonacci/perf.32bit-pop-114limb.sub-cmc.1G
-rwxr-xr-x 1 peter peter 8.4K May 19 04:29 a.out
-rw-r--r-- 1 peter peter 8.9K Jul 25  2017 fibonacci/perf.python-xnor-2n
-rw-r--r-- 1 peter peter 9.5K Jul 26  2017 fibonacci/fibonacci-1G-performance.asm
-rwxr-xr-x 1 peter peter 9.6K Apr 12 23:25 empty-args
-rw-r--r-- 1 peter peter 9.7K Dec 18 17:00 bubblesort.asm
-rwxr-xr-x 1 peter peter 9.9K Feb  6 23:34 parity-party/a.out
-rw-r--r-- 1 peter peter 9.9K Jul 25  2017 fibonacci/fibonacci-1G-performance.asm~
...

파이프를 통해 디렉토리를 필터링 할 수 있습니다. grep -v '^d'

파일 이름에 패턴이있는 경우 파일이 아닌 디렉토리 만 일치하는 글로브를 사용할 수 있습니다. 예를 들면 ll -rSd **/*.jpg, 또는 **/*.*디렉토리 이름의 아무도가없는 경우 작동 .그들, 모든 파일이 당신이 원하는 .

(DOS 배경 지식을 가진 사람들의 경우 : *.*유닉스 에는 마법이 없습니다 . 문자 그대로의 점이 포함 된 디렉토리 항목과 일치하지만 실행 파일 및 텍스트 파일 이외의 파일 이름을 사용하는 것이 일반적입니다.)

@dessert는 모든 파일 shopt -s dotglob과 일치 해야한다고 지적 합니다.


GNU로 find

하나의 ls명령 줄 에 맞지 않는 파일이 너무 많지 않으면 파일을 정렬 할 수 find -exec ls {} +있는 명령 줄에 모두 넣 ls습니다.

find -not -type d -exec ls --color -lrSh {} +

-not -type d대신에 사용 -type f하면 심볼릭 링크, 명명 된 파이프, 소켓, 장치 파일 및 디렉토리에서 발동되는 모든 것을 무시하지 않아도됩니다.


du:

du -ach | sort -h
....
4.0K    x86-modedetect-polyglot.o
8.0K    ascii-compress-base.asm
8.0K    dizzy-integer
8.0K    stopwatch-rdtsc.asm
8.0K    string-exponential.asm
8.0K    true-binary
12K     a.out
12K     bubblesort.asm
12K     casexchg
12K     empty-args
100K    parity-party
220K    fibonacci
628K    total

이제 디렉토리 이름이 목록에 정렬되어 모든 내용의 합계를 합하지만 개별 파일은 여전히 ​​포함됩니다.

sort -h, aka --human-numeric-sortdu -h인쇄물 과 같이 크기 접미사로 숫자를 정렬 합니다. 와 함께 사용하기에 완벽합니다 du.

나는 종종을 사용 du -sch * | sort -h하거나 */디렉토리 만 가져옵니다.

du -sch **/* | sort -h옵션 du이있는 것을 잊어 버린 경우 위의 출력을 제공합니다 -a.

(나는 답변을 게시하기 때문에 시간을 들여서 보았습니다. 대화 형 사용의 경우 아마 방금 사용했을 것 du -sch **/*입니다.

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