Як знайти найбільший файл у каталозі та його підкаталогах?


102

Ми тільки починаємо клас UNIX і вивчаємо різноманітні команди Bash. Наше завдання включає виконання різних команд у каталозі, який також має під собою ряд папок.

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

find . -type l | wc -l

Але я хотів би знати, куди звернутися звідти, щоб знайти найбільший файл у всьому каталозі. Я бачив щось щодо duкоманди, але ми цього не дізналися, тому в репертуарі речей, які ми дізналися, я припускаю, що нам потрібно якось зв’язати це з ls -tкомандою.

І вибачте мене, якщо моє «лінго» невірно, я все одно звикаю!


2
Якщо ви знаєте команду, але не знаєте, як її використовувати, то спробуйте ввести текст, manа потім - команда, яка вас зацікавила. Вгору з’явиться гарний вручну для цієї команди (натисніть, qщоб повернутися до командного рядка).
Дюни

Відповіді:


126

Цитата з цього ссилка-

Якщо ви хочете знайти та роздрукувати топ-10 найбільших імен файлів (а не каталогів) у певному каталозі та його підкаталогах

$ find . -printf '%s %p\n'|sort -nr|head

Для обмеження пошуку в поточному каталозі використовуйте "-maxdepth 1" з find.

$ find . -maxdepth 1 -printf '%s %p\n'|sort -nr|head

І щоб надрукувати топ-10 найбільших "файлів і каталогів":

$ du -a . | sort -nr | head

** Використовуйте "head -n X" замість єдиної "head" вище, щоб надрукувати найбільші X найбільші файли (у всіх вищенаведених прикладах)


1
Чому "du -a. | Sort -nr | head" повертає вдвічі більше КБ, ніж фактичний розмір файлу?
xxjjnn

6
Ах, вам потрібно додати опцію 'k', або вона показує кратні 512 байти, а не 1024. du
-ak

2
для першого, як отримати розмір у читаному для людини форматі?
Блуз

@Bluz Я хотів би спробувати замінити '%s %p\n'з '%p\n'і додавши |xargs ls -lhдо кінця
Duncan X Сімпсон

6
Перше рішення не працює на OS X для мене, так що я в кінцевому підсумку , використовуючи швидкий хак , щоб відфільтрувати каталоги з третього розчину: du -am . | sort -nr | grep '\..*\.' | head. Це mдля відображення розміру файлу в мегабайтах і використовується grepдля показу рядків щонайменше з двома крапками, перша знаходиться в ./шляху, друга - у розширенні файлу, наприклад .mov.
psmith

63

Щоб знайти топ-25 файлів у поточному каталозі та його підкаталогах:

find . -type f -exec ls -al {} \; | sort -nr -k5 | head -n 25

Це дозволить вивести 25 найпопулярніших файлів шляхом сортування на основі розміру файлів за допомогою піпетної команди "sort -nr -k5".

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

find . -type f -exec ls -alh {} \; | sort -hr -k5 | head -n 25


10
find . -type f | xargs ls -lS | head -n 1

виходи

-rw-r--r--  1 nneonneo  staff  9274991 Apr 11 02:29 ./devel/misc/test.out

Якщо ви просто хочете назву файлу:

find . -type f | xargs ls -1S | head -n 1

Це дозволяє уникнути використання awkта дозволяє використовувати будь-які прапори ls.

Caveat . Оскільки xargsнамагається уникнути створення надмірних командних рядків, це може бути невдалим, якщо ви запускаєте його в каталозі з великою кількістю файлів, оскільки в lsкінцевому підсумку виконується не один раз. Це не є непереборною проблемою (ви можете зібрати head -n 1вихідні дані з кожного lsвиклику та запустити ls -Sзнову, циклічно, поки у вас не буде єдиного файлу), але це дійсно дещо змінює цей підхід.


Вибачте xargs, я нехтував вас +1
Стів

2
для обробки назви файлів з пробілами, використовуйтеfind . -type f -print0 | xargs -0 ls -lS | head -n 1
rymo

Це знаходить найбільші файли лише у xargsвиконаній першій партії . Щоб виправити це додати сортування: find . -type f -print0 | xargs -0 ls -lS | sort -rk 5 | head -n 10. Для мене працював OSX.
psmith

10

Немає простої команди для пошуку найбільших файлів / каталогів у файловій системі Linux / UNIX / BSD. Однак, поєднавши наступні три команди (за допомогою труб), ви можете легко знайти список найбільших файлів:

# du -a /var | sort -n -r | head -n 10

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

$ cd /path/to/some/var
$ du -hsx * | sort -rh | head -10

Де,

  • Var - це каталог, який ви хочете шукати
  • du команда -h варіант: відображення розмірів у читаному для людини форматі (наприклад, 1K, 234M, 2G).
  • параметр du command -s: показувати лише загальний для кожного аргументу (резюме).
  • параметр du команда -x: пропуск каталогів у різних файлових системах.
  • параметр сортування команда -r: повернення результатів порівнянь.
  • Сортувати команду -h варіант: порівняти читані людиною числа. Це лише специфічний для GNU сортування варіант.
  • головна команда -10 АБО -на 10 варіант: показати перші 10 рядків.

Мені подобається 2-а команда краще, але на OSX, не встановлений варіант -h для сортування версії. Має бути для mac: du -hsx * | сортувати -рн | голова -10
Янна ВР

1
Люблю цю другу команду! Найкраще з усіх, що я спробував - я збережу його на потім.
CodeMouse92

Чітко пояснює команду докладно +1
Harish

8

У цьому списку файли рекурсивно, якщо вони є звичайними файлами, сортується за 7-м полем (розмір у моєму findвиведенні; перевіряйте ваш) та показує лише перший файл.

find . -type f -ls | sort +7 | head -1

Перший варіант до find- це початковий шлях рекурсивного пошуку. Тип fпошуку звичайних файлів. Зауважте, що якщо ви спробуєте проаналізувати це як ім'я файлу, ви можете не вдатися, якщо ім'я файлу містить пробіли, нові рядки або інші спеціальні символи. Параметри sortтакож залежать від операційної системи. Я використовую FreeBSD.

"Кращим", але більш складним і важчим рішенням було б findперейти до каталогів, але, можливо, використовувати statдля отримання деталей про файл, а потім, можливо, використовувати awkдля пошуку найбільшого розміру. Зауважте, що вихід statтакож залежить від вашої операційної системи.


1
Що таке +7аргумент мав робити? На моїй машині сортування просто скаржиться, що він не може знайти названий файл +7.
Дюни

@Dunes - Як я вже сказав, перевірте сторінку чоловіка sortу вашій системі. На даний момент я використовую OS X 10.4, де використання походить від типу FreeBSD : sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]... Зауважте +POS [-POS2]. Це працює і в поточних версіях FreeBSD.
ghoti

2
Здається, ти маєш для мене іншу програму сортування. Це головна сторінка для моєї програми сортування - linux.die.net/man/1/sort Для роботи на моїй машині вам потрібно буде явно використовувати -karg, наприклад. sort -k 7. редагувати: OSX 10.5 сторінка man для сортування, схоже, змінилася на версію, яку я маю.
Дюни

1
@Dunes - Це все сортування GNU, але різні версії. [+POS1] [-POS2]Позначення просто стара. Наскільки я можу сказати, це позначення все ще підтримується сучасним сортом GNU, хоча тепер, коли я дивлюся, воно, схоже, було викинуте зі сторінки сортування після приблизно версії 5.1. Ви можете побачити його на сторінці man для сортування для FreeBSD 4.11 . Я думаю, я не читав сторінку чоловіка сорту з моменту виходу FreeBSD 5.0!
ghoti

Також зауважте, що +POS1параметри сортування враховуються від нуля, тоді як -k POS1рахуються з одиниці.
ghoti

6

Тут ви знайдете найбільший файл чи папку у вашому поточному робочому каталозі:

ls -S /path/to/folder | head -1

Щоб знайти найбільший файл у всіх підкаталогах:

find /path/to/folder -type f -exec ls -s {} \; | sort -nr | awk 'NR==1 { $1=""; sub(/^ /, ""); print }'

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

@Dunes: Ви праві, перша команда може знайти каталоги, але не через поведінку за замовчуванням ls. У моєму тестуванні -Sпрапор буде містити один файл у рядку. Я виправив другу команду. Сподіваємось, тепер це все доказ. Дякую.
Стів

4

У Solaris я використовую:

find . -type f -ls|sort -nr -k7|awk 'NR==1{print $7,$11}' #formatted

або

find . -type f -ls | sort -nrk7 | head -1 #unformatted

тому що нічого іншого, розміщеного тут, не працює. Тут ви знайдете найбільший файл у $PWDпідкаталогах.


2

Спробуйте наступний одноклапник (відобразити найбільші 20 найбільших файлів):

ls -1Rs | sed -e "s/^ *//" | grep "^[0-9]" | sort -nr | head -n20

або (для людини зрозумілих розмірів):

ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20

Підходить під Linux / BSD / OSX порівняно з іншими відповідями, оскільки -printfпараметр find не існує в OSX / BSD і statмає різні параметри залежно від ОС. Однак другу команду для належної роботи на OSX / BSD (як sortне має -h), встановіть sortіз неї coreutilsта видаліть -hіз неї lsта sort -nrзамість цього використовуйте .

Тож ці псевдоніми корисно мати у своїх файлах rc :

alias big='du -ah . | sort -rh | head -20'
alias big-files='ls -1Rhs | sed -e "s/^ *//" | grep "^[0-9]" | sort -hr | head -n20'

Це показує лише ім'я файлу без шляху, тому насправді не допомагає знайти найбільший файл.
psmith

Для мене на вершині у мене справді найбільші файли, але наприкінці це не дає мені правильних файлів
Борислав Марков,

2

Спробуйте виконати наступну команду:

find /your/path -printf "%k %p\n" | sort -g -k 1,1 | awk '{if($1 > 500000) print $1/1024 "MB" " " $2 }' |tail -n 1 

Це надрукує найбільше ім'я та розмір файлу та більше 500 млн. Ви можете перемістити if($1 > 500000)файл, і він надрукує найбільший файл у каталозі.



0

Цей сценарій спрощує пошук найбільших файлів для подальших дій. Я зберігаю його у своєму каталозі ~ / bin, а ~ / bin вкладаю у свій $ PATH.

#!/usr/bin/env bash
# scriptname: above
# author: Jonathan D. Lettvin, 201401220235

# This finds files of size >= $1 (format ${count}[K|M|G|T], default 10G)
# using a reliable version-independent bash hash to relax find's -size syntax.
# Specifying size using 'T' for Terabytes is supported.
# Output size has units (K|M|G|T) in the left hand output column.

# Example:
#   ubuntu12.04$ above 1T
#   128T /proc/core

# http://stackoverflow.com/questions/1494178/how-to-define-hash-tables-in-bash
# Inspiration for hasch: thanks Adam Katz, Oct 18 2012 00:39
function hasch() { local hasch=`echo "$1" | cksum`; echo "${hasch//[!0-9]}"; }
function usage() { echo "Usage: $0 [{count}{k|K|m|M|g|G|t|T}"; exit 1; }
function arg1() {
    # Translate single arg (if present) into format usable by find.
    count=10; units=G;  # Default find -size argument to 10G.
    size=${count}${units}
    if [ -n "$1" ]; then
        for P in TT tT GG gG MM mM Kk kk; do xlat[`hasch ${P:0:1}`]="${P:1:1}"; done
        units=${xlat[`hasch ${1:(-1)}`]}; count=${1:0:(-1)}
        test -n "$units" || usage
        test -x $(echo "$count" | sed s/[0-9]//g) || usage
        if [ "$units" == "T" ]; then units="G"; let count=$count*1024; fi
        size=${count}${units}
    fi
}
function main() {
    sudo \
        find / -type f -size +$size -exec ls -lh {} \; 2>/dev/null | \
        awk '{ N=$5; fn=$9; for(i=10;i<=NF;i++){fn=fn" "$i};print N " " fn }'
}

arg1 $1
main $size

0

Це досить простий спосіб зробити це:

ls -l | tr -s " " " " | cut -d " " -f 5,9 | sort -n -r | head -n 1***

І ви отримаєте це: 8445 examples.desktop


Що 1***потрібно зробити наприкінці? Я отримую помилку "не знайдено збігів" для цього аргументу.
user4815162342

0

Рішення для Linux: Наприклад, ви хочете переглянути всі файли / список папок вашого домашнього (/) каталогу відповідно до розміру файлу / папки (у порядку зменшення ).

sudo du -xm / | сортувати -рн | більше


0

Щоб перерахувати більший файл у папці

ls -sh /pathFolder | sort -rh | head -n 1

Вихід ls -shмає перегляд розміру файлу в розмірі sі hзрозумілому для людини розмірі.

Ви можете використовувати ls -shS /pathFolder | head -n 1. Більший Sвід lsвже упорядкованого списку від великих файлів до менших, але перший результат - це сума всіх файлів у цій папці. Тож якщо ви хочете просто перерахувати більший файл, один файл, вам потрібно head -n 2перевірити "результат другого рядка" або використати перший приклад ls sort head.


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