Як перелічити всі файли, упорядковані за розміром


241

Я хотів би перерахувати всі файли в порядку великого до малого розміру, і файли можуть бути присутніми де-небудь у певній папці.



5
від man ls:-S sort by file size
ctrl-alt-delor

Ви маєте на увазі "файли в цьому каталозі" або "файли можуть бути в будь-якому підкаталозі".
ctrl-alt-delor

Якщо ви можете / хочете використовувати інструмент GUI, подивіться на QDirStat , раніше KDirStat .
RhinoDevel

Відповіді:


290

Просто використовуйте щось на кшталт:

ls -lS /path/to/folder/

Capital S .

Це дозволить сортувати файли за розміром.

Також дивіться:

man ls

-S     sort by file size

Якщо ви хочете сортувати у зворотному порядку, просто додайте -rперемикач.

Оновлення:

Щоб виключити каталоги (і за умови, що жодне з імен файлів або цілей символьного посилання не містить символів нового рядка):

ls -lS | grep -v '^d' 

Оновлення 2:

Зараз я бачу, як він все ще показує символічні посилання, які можуть бути папками. Символічні посилання завжди починаються з літери l, як у посиланні.

Змініть команду для фільтрування для -. Тут слід залишати лише звичайні файли:

ls -lS | grep '^-'

У моїй системі це відображаються лише звичайні файли.

оновлення 3:

Щоб додати рекурсію, я б залишив сортування рядків у sortкоманді і сказав їй використовувати 5-й стовпчик для сортування.

ls -lR | grep '^-' | sort -k 5 -rn

-rnозначає Зворотний і числовий, щоб отримати найбільші файли вгорі. Нижня частина цієї команди полягає в тому, що вона не показує повний шлях файлів.

Якщо вам потрібен повний шлях до файлів, використовуйте щось подібне:

find . -type f  -exec du -h {} + | sort -r -h

findКоманда рекурсивно знайти всі файли в усіх вкладених каталогах в .і виклику du -h( що означає використання дискового -humanreadable ) , а потім відсортувати вихідні знову. Якщо ваш find/ sortне підтримує -h, замініть du -kі sort -rn. Зауважте, що розмір та використання диска - це не одне і те ж.


5
duдає використання диска, яке відрізняється від розміру файлу. З (GNU) du -hчислове сортування не працюватиме ( -hдля сортування вам знадобиться опція GNU). xargs очікує введення списку можливо цитованих слів, тому воно не працюватиме, якщо назви файлів містять пробіли або цитовані символи.
Стефан Хазелас

1
Я бачу, що -S робить порядок зменшення розміру, а як щодо порядку зростання?
демонголем

3
Після @ StéphaneChazelas, це працює для мене: find . -type f -print0 | xargs -0 du -h | sort -rh. Якщо ви просто хочете сказати , найбільші 30 файлів: find . -type f -print0 | xargs -0 du -h | sort -rh | head -n 30.
user7543

Привіт! Не могли б ви пояснити + |синтаксис + | sort -r -h?
Віктор

@Victor, будь ласка , см unix.stackexchange.com/questions/195939 / ... .
Hew Wolff

25

Ви можете використовувати щось на кшталт пошуку та сортування.

find . -type f -ls | sort -r -n -k7

( -lsопція не є стандартною, але вона зустрічається у багатьох реалізаціях знаходження, не тільки в GNU. У GNU find та ін. вона відображає щось подібне, ls -liза кількома винятками, наприклад, файли з ACL не позначені знаком +)

Якщо імена файлів можуть містити символи нового рядка, GNU find та GNU сортують:

find . -type f -ls -printf '\0' | sort -zk7rn | tr -d '\0'

Це передбачає стовпчик "групи" (від -ls), що не містить пробілів (отже, параметр -k 7), але це не обов'язково.
Колістівра

1
чому б просто не знаходити ... -print0 | сортувати -zk7rn0?
Андре де Міранда

10

З zsh та GNU ls:

ls -ldU -- **/*(.OL)

Де (.OL)є глобальний класифікатор , .вибирати лише звичайні файли, OLзмінювати порядок по довжині (розмір файлу, o для порядку зростання, Oдля зменшення).

(зауважте, що у старих версіях zsh виникли проблеми з розмірами файлів понад 2 ^ 32).

Деякі операційні системи мають обмеження щодо розміру списку аргументів, переданого команді. У цих випадках вам знадобиться:

autoload -U zargs
zargs ./**/*(.OL) -- ls -ldU

Якщо ви просто хочете список файлів, а не детальний вихід, просто виконайте:

print -rl -- **/*(.OL)

Якщо ви хочете включити приховані файли (ім’я яких починається з крапки, за винятком .і ..), а також шукати в прихованих каталогах, додайте Dкласифікатор глобалізації:

print -rl -- **/*(.DOL)

що робить .OL? Це частина команди?
alpha_989

@ alpha_989, див. редагувати
Stéphane Chazelas

Дякую за пояснення, Стефане .. Однак чомусь .. команда не працює на моїй робочій станції .. Я використовую ls (GNU coreutils) 8.25і zsh 5.1.1 (x86_64-ubuntu-linux-gnu). Це працює лише для певних версій lsі zsh?
alpha_989

@ alpha_989, яким чином це не працює для вас? Він працює для мене з тими ж самими версіями, і немає нічого в тому коді, який би не працював у версіях принаймні 15 років тому.
Стефан Шазелас

9

Список файлів за розміром за зростанням буде:

ls -lSr

Варіанти:

  • l: long, показує детальну інформацію про користувача, групу, інші атрибути, дату тощо.
  • S: перелік замовлень за розміром (за замовчуванням зменшується)
  • r: змінює порядок лістингу

Ви б не хотіли пояснити варіанти покращення якості відповіді?
Rui F Ribeiro

6

Якщо говорити про те, що "файли можуть бути присутніми в будь-якій точці певної папки", це означає, що ви хочете рекурсивно скидати всі каталоги (папки) в межах початкового каталогу (папки). Це те find, що потрібно зробити:

find . -type f -exec ls -lSd {} +

Це "знаходить" всі файли в поточному робочому каталозі ( .). Для кожного знайденого файлу lsзапускається процес для сортування об'єктів, знайдених за розміром. +Термінатор на -execпричинах численних аргументів, переданих в списку ls. Якщо ваш каталог (папка) не містить дуже великої кількості файлів, у вас повинен бути один список (і, таким чином, один роздвоєний процес), що призводить до бажаного результату.


1
це приємно, оскільки дозволяє використовувати -h модифікатор на ls, щоб показувати хороші розміри файлів
shmish111

4

Відображення списку файлів у зворотному порядку: ls -lSrh

Для порядку зростання: ls -lSh


1
+1 за використання прапора -h для дружнього для людини результату.
computingfreak

2

Я щось писав до цього ступеню назад. Ви можете передати аргумент, щоб вказати, скільки файлів у списку, або просто набрати big, у такому випадку ви отримаєте 10.

big () { 
    NUM_FILES=10;
    if [ $1 ]; then
        NUM_FILES=$1;
    fi;
    du | sort -nr | head -n $NUM_FILES
}

2

Спробуйте ці, мені це добре працює.

$ find /home/san -type f -printf '%s %p\n'| sort -nr | head -n 10

# find /root -type f -exec ls -lS {} + | head -n 10 | awk '{ print $5, $9 }'

Хоча не ідеальна відповідь, але працює певною мірою

$ ls -lS |grep  '^-' | head -n 6 

1
awk працює чудово, якщо назви файлів не містять пробілів.
Ейр Нім

так .. використовувати "sed" і замінити пробіл на підкреслення? якщо це допоможе
Sand1512

Ні, я використовую sedдля скорочення випуску
Eir Nym,

1

Додавши відповідь Дельха та коментар Стефана Шазеласа ...

find -print0в поєднанні з xargs -0підтримкою пробілів / пробілів / нотаток.

du -h | sort -rn не сортується належним чином між різними байтовими кратностями, наприклад, 1,1 М покаже після 128 К, що неправильно.

sort -rh (- людсько-числовий сорт) піклується про це, але він працює лише у версії GNU.

Команди нижче нададуть потрібний вихід.

Людина, що читається, за типом GNU / Linux:

find . -type f -print0 | xargs -0 du -h | sort -rh

У кілобайтних одиницях на BSD / OSX / інші:

find . -type f -print0 | xargs -0 du -k | sort -rn

Для BSD / OSX див . Також https://unix.stackexchange.com/a/188375/82895 .


1

Як варіант початкового питання, якщо ви хочете побачити накопичений розмір файлів у підкаталогах:

#!/bin/bash
find ${1:-.} -maxdepth 1 -type d -exec du -sm {} \; | sort -nr

Розміри відображатимуться в Мегабайти ( mв du -sm). Інші значення , прийняті duв -kкілобайти, -gгігабайти. Використання -hдля читаного для людини відображення неможливо, оскільки воно порушить сортування.

Ось версія, яка використовує sedдля додавання Mмегабайт:

find ${1:-.} -maxdepth 1  -type d  -exec du -sm {} \; | sort -nr | sed -E 's/^([0-9]+)/\1M/g'

Налаштовується каталог, що відображається, за допомогою ${1:-.}якого використовувати аргумент першого командного рядка, якщо він наданий, або використовувати поточний каталог, якщо викликається без аргументів.

ПРИМІТКА. Це може зайняти багато часу, коли багато файлів. Цей параметр -type dвідображатиме лише підкаталоги та виключає файли у поточній папці; якщо ви також хочете побачити файли в поточній папці, тоді видаліть їх.

Примітка: можливо, ви хочете використовувати ncduзамість цього доступний у більшості Linux-репостів (на ubuntu / debian apt install ncdu), а також у osx ( brew install ncdu).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.