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

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

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

find . -type l | wc -l

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

И простите меня, если мой "жаргон" неверен, я все еще привык к этому!

Ответ 1

Цитата из эта ссылка -

Если вы хотите найти и распечатать 10 самых больших имен файлов (не каталоги) в конкретном каталоге и его подкаталогах

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

Чтобы ограничить поиск в настоящем каталоге, используйте "-maxdepth 1" с найти.

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

И распечатать 10 самых больших "файлов и каталогов":

$ du -a . | sort -nr | head

** Используйте "head -n X" вместо единственной "головы" выше, чтобы распечатать самые большие файлы X (во всех приведенных выше примерах).

Ответ 2

Чтобы найти 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

Ответ 3

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, зацикливая до тех пор, пока у вас не будет один файл), но это немного изменит этот подход.

Ответ 4

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

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

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

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

Ответ 5

Нет простой команды для поиска самых больших файлов/каталогов в файловой системе 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 -x: пропустить каталоги на различные файловые системы.
  • команда сортировки -r: отменить результат сравнений.
  • команда сортировки -h: сравнить читаемые человеком номера. Это опция только для GNU.
  • команда head -10 OR -n 10: отображать первые 10 строк.

Ответ 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 }'

Ответ 7

В 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 и подкаталогах.

Ответ 8

Попробуйте выполнить следующую команду:

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

Это будет печатать наибольшее имя и размер файла и более 500M. Вы можете перемещать if($1 > 500000), и он будет печатать самый большой файл в каталоге.

Ответ 9

Попробуйте использовать один однострочный (отображать 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 по сравнению с другими ответами, так как опция find -printf не существует в 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'

Ответ 10

du -aS /PATH/TO/folder | sort -rn | head -2 | tail -1

или

du -aS /PATH/TO/folder | sort -rn | awk 'NR==2'

Ответ 11

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

sudo du -xm/| sort -rn | более

Ответ 12

Этот script упрощает поиск больших файлов для дальнейших действий. Я храню его в каталоге ~/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 -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

Ответ 13

Это довольно простой способ сделать это:

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

И вы получите следующее: 8445 examples.desktop

Ответ 14

Чтобы отобразить больший файл в папке

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

Вывод ls -sh представляет собой ls -sh представление размера s и человека h размера номера файла.

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

Ответ 15

ls -alR|awk '{ if ($5 > max) {max=$5;ff=$9}} END {print max "\t" ff;}'