Список файлов в каталоге включая содержание подпапок с сортировкой

Я надеюсь перечислять все содержание каталога, включая содержание подпапок, но отсортированный по размеру файла. К настоящему времени мне удалось добраться до списка и сортировки все еще будучи рекурсивным с ls -lhSR( h хорошо иметь, но определенно не важный для меня, пока я могу получить размеры файла). Я, вероятно, пропускаю что-то очевидное, или спрашиваю невозможное, но любой совет здесь значительно ценился бы.

9
задан 14 June 2018 в 07:36

5 ответов

Можно использовать, найдите:

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)
15
ответ дан 23 November 2019 в 04:46

Так как Вы не указывали конкретную оболочку, вот является альтернативное использование спецификаторами шарика zsh с

setopt extendedglob

для рекурсии. Затем, например:

  1. рекурсивно простые файлы списка:

    printf '%s\n' **/*(.)
    
  2. рекурсивно перечислите простые файлы, заказанные путем увеличения Длины (т.е. размер):

    printf '%s\n' **/*(.oL)
    
  3. рекурсивно перечислите простые файлы, Заказанные путем уменьшения размера:

    printf '%s\n' **/*(.OL)
    
  4. рекурсивно перечислите простые файлы, заказанные путем уменьшения размера, и выберите лучшие 3 результата:

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

Если Вы хотите размеры файла также, то Вы могли использовать

du -hb **/*(.OL[1,3])
7
ответ дан 23 November 2019 в 04:46

С globstar опция оболочки установила Вас, может использовать оболочку globbing:

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

При попытке этого слишком многими файлами Вы будете получать “Список аргументов слишком долго” ошибка. Работать, вокруг которого, можно использовать printf и xargs:

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

Я просто понял, что это печатает каталоги (с размером 4 096 байтов) также – если Вы не хотите это, используйте это вместо этого:

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
4
ответ дан 23 November 2019 в 04:46

Если у Вас нет 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
    

В обоих случаях я решил использовать пустые нагруженные линии (-0, -z, -print0 опции), для сейфа против всех допустимых имен файлов.

3
ответ дан 23 November 2019 в 04:46

Для быстрого интерактивного использования на деревьях каталогов, которые не слишком огромны, 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: нет ничего волшебного о *.* на Unix. Это просто соответствует любой записи каталога, которая содержит литеральную точку. Но кроме исполняемых файлов и иногда текстовых файлов, распространено дать расширения имен файлов.)

@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, иначе --human-numeric-sort, числа видов с суффиксами размера как du -h печать. Это идеально подходит для использования с du.

Я часто использую du -sch * | sort -h, или */ получить только каталоги.

du -sch **/* | sort -h дал бы Вам вышеупомянутый вывод, если Вы забываете это du имеет a -a опция.

(Я только не торопился для поиска его, потому что я отправляю ответ. Для интерактивного использования я, вероятно, просто использовал бы du -sch **/*.

0
ответ дан 23 November 2019 в 04:46

Другие вопросы по тегам:

Похожие вопросы: