Как найти самый большой файл в каталоге и его подкаталогах?


102

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

Я знаю, как составить список и подсчитать все обычные файлы из корневой папки, используя:

find . -type l | wc -l

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

И простите меня, если мой «жаргон» неверен, я все еще привыкаю к ​​нему!


2
Если вы знаете команду, но не знаете, как ее использовать, попробуйте ввести, manа затем введите интересующую вас команду. Вверх появится удобный ввод вручную для этой команды (нажмите, qчтобы вернуться в командную строку).
Dunes

Ответы:


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
xxjjnn

2
для первого, как получить размер в удобочитаемом формате?
Bluz

@Bluz Я бы попробовал заменить '%s %p\n'на '%p\n'и добавить |xargs ls -lhв конец
Дункан Икс Симпсон

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.

Будьте осторожны . Поскольку xargsпытается избежать создания слишком длинных командных строк, это может привести к сбою, если вы запустите его в каталоге с большим количеством файлов, потому что в lsконечном итоге он будет выполняться более одного раза. Это не непреодолимая проблема (вы можете собирать head -n 1выходные данные каждого lsвызова и запускать ls -Sснова, повторяя цикл до тех пор, пока у вас не будет одного файла), но это несколько портит этот подход.


1
извини 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 option: показать только общее количество для каждого аргумента (сводка).
  • du command -x option: пропускать каталоги в разных файловых системах.
  • Команда sort -r параметр: отменить результат сравнения.
  • команда sort -h параметр: сравнить числа, читаемые человеком. Это только опция сортировки GNU.
  • head command -10 OR -n 10 option: показать первые 10 строк.

Мне больше нравится вторая команда, но в osx нет опции -h для версии sort. Должно быть для Mac: du -hsx * | sort -rn | голова -10
Yann VR

1
Люблю эту вторую команду! Лучшее из тех, что пробовал - приберегу на потом.
CodeMouse92

8

Это список файлов рекурсивно, если они обычные файлы, сортируется по 7-му полю (размер в моем findвыводе; проверьте ваше) и показывает только первый файл.

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

Первый вариант find- это начальный путь для рекурсивного поиска. A -тип fпоиска обычных файлов. Обратите внимание, что если вы попытаетесь проанализировать это как имя файла, вы можете потерпеть неудачу, если имя файла содержит пробелы, новые строки или другие специальные символы. Параметры sortтакже зависят от операционной системы. Я использую FreeBSD.

«Лучшим», но более сложным и тяжелым решением было бы findперемещение по каталогам, но, возможно, использование statдля получения подробной информации о файле, а затем, возможно, awkдля поиска наибольшего размера. Обратите внимание, что вывод statтакже зависит от вашей операционной системы.


1
Что +7должен делать arg? На моей машине sort просто жалуется, что не может найти файл с именем +7.
Dunes

@Dunes - Как я уже сказал, проверьте страницу руководства в sortсвоей системе. В настоящий момент я использую OS X 10.4, где использование происходит от FreeBSD sort : 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 Чтобы это работало на моей машине, вам нужно явно использовать -kаргумент, например. sort -k 7. edit: в OSX 10.5 страница руководства для сортировки, похоже, изменилась на версию, которая у меня есть.
Dunes

1
@Dunes - Это все вроде GNU, но разные версии. [+POS1] [-POS2]Обозначения просто старая. Насколько я могу судить, эта нотация все еще поддерживается современной сортировкой GNU, хотя теперь, когда я смотрю, кажется, что она была удалена со страницы руководства по сортировке примерно после версии 5.1. Вы можете увидеть его на странице руководства для сортировки FreeBSD 4.11 . Думаю, я не читал справочную страницу sort с тех пор, как была выпущена 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

@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 / | sort -rn | Больше


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.