Как найти самый большой размер файла в большом каталоге

Первый процесс, запущенный во время загрузки, получает PID 1.

Первый процесс, запущенный во время загрузки, имеет задание: он должен запускать все остальные процессы прямо или косвенно. Все процессы¹ в конечном счете являются потомками этого процесса, поскольку, кроме ядра, запускающего программу во время загрузки, единственным способом создания процесса является выполнение каким-либо процессом системного вызова для создания нового процесса.

У процесса с PID 1 есть задание: если процесс умирает, когда у него есть запущенные дочерние процессы, идентификатор родительского процесса дочернего процесса устанавливается равным 1. Когда дочерние процессы умирают, PID 1 должен их пожинать, т.е. вызывать wait, иначе останется зомби дочернего процесса.

Различные программы, называемые init (существует несколько реализаций), выполняют обе эти задачи.

В ядре Linux есть аргумент командной строки для изменения того, какой исполняемый файл выполняется первым процессом². Его можно использовать для запуска любого исполняемого файла, но если этот исполняемый файл не выполняет задачи инициализации, система не будет работать нормально. Эта функция в основном используется для входа в режим восстановления системы, например. только запуск оболочки на консоли и ничего больше.

После нормального запуска системы невозможно заменить PID 1, потому что init не умирает. Init не только не умирает, потому что он запрограммирован на вечную работу (init должен работать до тех пор, пока система не выключится), но даже получает специальную защиту от сигналов, которые могут убить другие процессы, такие как SIGKILL.

Linux имеет функцию пространства имен PID, которая позволяет определять подсистему с собственным набором идентификаторов процессов. Процессы в пространстве имен PID имеют разные PID при просмотре внутри пространства имен и снаружи пространства имен. Первый процесс в пространстве имен получает PID 1 в пространстве имен. Вне пространства имен у него не будет PID 1 (если init не решит ввести новое пространство имен PID, но init этого не делает, потому что это помешает ему выполнять свою работу).

¹ Это не совсем так, в некоторых ядрах есть другие способы запуска процесса. Например, Linux запускает modprobe, когда какое-то оборудование обнаруживается при определенных обстоятельствах. Но потомки init составляют подавляющее большинство процессов.
² Сначала после initramfs или initrd.

0
18.07.2017, 17:14
2 ответа

Предполагая, что ни одно из ваших имен файлов не содержит новой строки(\n)и что у вас есть утилиты GNU, вы можете использовать это как быстрое и грязное решение:

find. -maxdepth 1 -type f -exec stat --fmt $'%s\t%n' {} + | sort -n | tail -1

Удалите -maxdepth 1, если у вас есть подкаталоги, которые необходимо включить в поиск. Если ваш findне поддерживает терминатор +, вы можете заменить его менее эффективным \;. Измените строку формата на просто '%s', если вы не хотите, чтобы вывод имени файла.


Если у вас есть имена файлов с непечатаемыми символами -, вы можете использовать этот более медленный вариант:

find. -maxdepth 1 -type f -exec stat --printf "%s\t" {} \; -print | sort -n | tail -1

Удалите -print, если вы действительно не хотите выводить имя файла.


Думаю, для OSX можно использовать такую ​​команду, но у меня нет простого способа проверить ее. Удалите -print, если вы не хотите, чтобы имя файла выводилось :

.
find. -maxdepth 1 -type f -exec stat -f '%z' -n {} \; -print | sort -n | tail -n 1
2
28.01.2020, 02:19

Для печати самого большого файла (с размером в килобайтах ),lsподход:

ls -S1s --block-size=K | sed -n '2{p;q;}'

  • -S-сортировать по размеру файла, начиная с самого большого

  • -s-вывести выделенный размер каждого файла в блоках

  • -1-список по одному файлу в строке

  • sed -n '2{p;q;}'-1-я строка в выводе ls— это строка с размером total(, например.total 388K). 2-я строка — это строка, содержащая самый большой файл с его размером. Это выражение будет учитывать только вторую нужную строку

2
28.01.2020, 02:19

Теги

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