- Поиск больших файлов Linux
- Поиск больших файлов Linux
- 1. GDMap
- 2. Утилита ncdu
- 3. Утилита du
- 4. Утилита find
- Выводы
- Linux удалить файл размером 0
- Так как же удалить миллионы файлов из одной папки?
- Подготовка
- Тесты
- Удаление через rm -r
- Удаление через rm ./*
- Удаление через find -exec
- Удаление через find -delete
- Удаление через ls -f и xargs
- Удаление через perl readdir
- Удаление через программу на C readdir + unlink
- Как обрезать файлы до нулевого размера в Linux
- How to Truncate (Empty) Files in Linux
- В этом руководстве объясняется, как обрезать файлы до нулевого размера в системах Linux с помощью перенаправления оболочки и truncate команды.
- Shell Redirection
- truncate команда
- Очистить все файлы журнала
- Вывод
- Как удалить файлы и каталоги в терминале Linux?
- Как удалить файлы с помощью rm
- Как удалить каталоги с помощью rm
- Как удалить каталоги с помощью rmdir
Поиск больших файлов Linux
Если на вашем жёстком диске закончилось свободное пространство, самый простой способ его освободить — найти и удалить самые большие и при этом ненужные файлы. Такая задача может возникнуть как на сервере, так и на домашнем компьютере, поэтому существуют удобные решения для обоих ситуаций. Способов поиска больших файлов существует очень много.
Как вы уже поняли, в этой небольшой инструкции мы рассмотрим, как найти большие файлы Linux с помощью графического интерфейса или консольных утилит. Будем двигаться от самого простого к более сложному.
Поиск больших файлов Linux
1. GDMap
Несмотря на то, что графических утилит есть около десятка, все они мне не очень нравятся. Например в Gnome можно использовать GDMap, а в KDE — fileslight. Обе утилиты сканируют файловую систему и выводят все файлы в виде диаграммы. Размер блока зависит от размера файла. Чем больше файл или папка, тем больше блок. Для установки GDMap в Ubuntu выполните:
sudo apt install gdmap
Затем запустите утилиту из главного меню. По умолчанию она отображает домашнюю папку. Здесь можно оценить, какие файлы самые увесистые.
2. Утилита ncdu
Это псевдографическая утилита, которая работает в терминале Linux. Она отображает список файлов и директорий по объёму и, что самое интересное, тут же позволяет удалять ненужные файлы. Для установки утилиты выполните:
sudo apt install ncdu
Затем запустите утилиту, передав ей в качестве параметра папку, которую надо просканировать. Можно проверить ту же домашнюю папку:
У утилиты очень простое управление. Для перемещения по списку используйте кнопки со стрелками вверх и вниз, для открытия папки — клавишу Enter, а для удаления файла — кнопку d. Также можно использовать для перемещения кнопки в Vim стиле — h, j, k, l.
3. Утилита du
Если у вас нет возможности устанавливать новые утилиты, может помочь установленная по умолчанию во всех дистрибутивах утилита du. С помощью следующей команды вы можете вывести 20 самых больших файлов и папок в нужной папке, для примера снова возьмём домашнюю папку:
sudo du -a /home/ | sort -n -r | head -n 20
Мы не можем использовать опцию -h для вывода размера в читабельном формате, потому что тогда не будет работать сортировка.
4. Утилита find
С помощью команды find вы тоже можете искать большие файлы Linux. Для этого используйте опцию -size. Например, давайте найдём файлы, которые больше 500 мегабайтов в той же домашней папке:
sudo find /home -xdev -type f -size +500M
Можно пойти ещё дальше — вывести размер этих файлов и отсортировать их по размеру:
find / -xdev -type f -size +100M -exec du -sh <> ‘;’ | sort -rh
Самые большие файлы Linux будут сверху, а более мелкие — ниже.
Выводы
В этой небольшой статье мы разобрались, как выполняется поиск больших файлов Linux. После того, как вы их нашли, остаётся выбрать ненужные и удалить, если подобное происходит на сервере, то, обычно, это логи различных сервисов или кэш. Обратите внимание, что после удаления файлов место в файловой системе может и не освободится. Для полного освобождения места следует перезагрузить компьютер. Это довольно частая проблема на серверах и VPS.
Источник
Linux удалить файл размером 0
Как удалить определенный файл в Linux, если его размер равен 0. Я хочу выполнить это в crontab без каких-либо дополнительных script.
Что-то вроде этого?
Это приведет к удалению всех файлов в каталоге (и ниже), размер которого равен нулю.
Если вам нужен конкретный файл,
Поиск и удаление пустых файлов в текущем каталоге и подкаталогах:
-type f необходимо, так как также каталоги отмечены как нулевые.
Точка . (текущий каталог) – это начальный каталог поиска. Если у вас есть поиск GNU (например, не Mac OS), вы можете опустить его в этом случае:
Если файлы для поиска не указаны, используется текущий каталог (.).
Для этого вы можете использовать команду find . Мы можем сопоставлять файлы с помощью -type f и сопоставлять пустые файлы с помощью -size 0 . Затем мы можем удалить совпадения с помощью -delete .
Это работает для простой BSD, поэтому он должен быть универсально совместим со всеми вкусами. Ниже, например, в pwd ( . )
В Linux команда stat (1) полезна, когда вам не нужно найти (1):
Команда stat здесь позволяет нам просто получить размер файла, что -c %s (см. man-страницы для других форматов). Я запускаю программу stat и фиксирую ее вывод, что $( ) . Этот результат показан численно, что внешний (( )) . Если для размера указан ноль, то это FALSE, поэтому выполняется вторая часть OR. Без нуля (непустой файл) будет TRUE, поэтому rm не будет выполнен.
Для нерекурсивного удаления (с использованием du и awk):
Источник
Так как же удалить миллионы файлов из одной папки?
Феерическая расстановка точек над i в вопросе удаления файлов из переполненной директории.
Прочитал статью Необычное переполнение жесткого диска или как удалить миллионы файлов из одной папки и очень удивился. Неужели в стандартном инструментарии Linux нет простых средств для работы с переполненными директориями и необходимо прибегать к столь низкоуровневым способам, как вызов getdents() напрямую.
Для тех, кто не в курсе проблемы, краткое описание: если вы случайно создали в одной директории огромное количество файлов без иерархии — т.е. от 5 млн файлов, лежащих в одной единственной плоской директории, то быстро удалить их не получится. Кроме того, не все утилиты в linux могут это сделать в принципе — либо будут сильно нагружать процессор/HDD, либо займут очень много памяти.
Так что я выделил время, организовал тестовый полигон и попробовал различные средства, как предложенные в комментариях, так и найденные в различных статьях и свои собственные.
Подготовка
Так как создавать переполненную директорию на своём HDD рабочего компьютера, потом мучиться с её удалением ну никак не хочется, создадим виртуальную ФС в отдельном файле и примонтируем её через loop-устройство. К счастью, в Linux с этим всё просто.
Создаём пустой файл размером 200Гб
Многие советуют использовать для этого утилиту dd, например dd if=/dev/zero of=disk-image bs=1M count=1M , но это работает несравнимо медленнее, а результат, как я понимаю, одинаковый.
Форматируем файл в ext4 и монтируем его как файловую систему
К сожалению, я узнал об опции -N команды mkfs.ext4 уже после экспериментов. Она позволяет увеличить лимит на количество inode на FS, не увеличивая размер файла образа. Но, с другой стороны, стандартные настройки — ближе к реальным условиям.
Создаем множество пустых файлов (будет работать несколько часов)
Кстати, если в начале файлы создавались достаточно быстро, то последующие добавлялись всё медленнее и медленнее, появлялись рандомные паузы, росло использование памяти ядром. Так что хранение большого числа файлов в плоской директории само по себе плохая идея.
Проверяем, что все айноды на ФС исчерпаны.
Размер файла директории
Теперь попробуем удалить эту директорию со всем её содержимым различными способами.
Тесты
После каждого теста сбрасываем кеш файловой системы
sudo sh -c ‘sync && echo 1 > /proc/sys/vm/drop_caches’
для того чтобы не занять быстро всю память и сравнивать скорость удаления в одинаковых условиях.
Удаление через rm -r
$ rm -r /mnt/test_dir/
Под strace несколько раз подряд (. ) вызывает getdents() , затем очень много вызывает unlinkat() и так в цикле. Занял 30Мб RAM, не растет.
Удаляет содержимое успешно.
Т.е. удалять переполненные директории с помощью rm -r /путь/до/директории вполне нормально.
Удаление через rm ./*
$ rm /mnt/test_dir/*
Запускает дочерний процесс шелла, который дорос до 600Мб, прибил по ^C . Ничего не удалил.
Очевидно, что glob по звёздочке обрабатывается самим шеллом, накапливается в памяти и передается команде rm после того как считается директория целиком.
Удаление через find -exec
$ find /mnt/test_dir/ -type f -exec rm -v <> \;
Под strace вызывает только getdents() . процесс find вырос до 600Мб, прибил по ^C . Ничего не удалил.
find действует так же, как и * в шелле — сперва строит полный список в памяти.
Удаление через find -delete
$ find /mnt/test_dir/ -type f -delete
Вырос до 600Мб, прибил по ^C . Ничего не удалил.
Аналогично предыдущей команде. И это крайне удивительно! На эту команду я возлагал надежду изначально.
Удаление через ls -f и xargs
$ cd /mnt/test_dir/ ; ls -f . | xargs -n 100 rm
параметр -f говорит, что не нужно сортировать список файлов.
Создает такую иерархию процессов:
ls -f в данной ситуации ведет себя адекватнее, чем find и не накапливает список файлов в памяти без необходимости. ls без параметров (как и find ) — считывает список файлов в память целиком. Очевидно, для сортировки. Но этот способ плох тем, что постоянно вызывает rm , чем создается дополнительный оверхед.
Из этого вытекает ещё один способ — можно вывод ls -f перенаправить в файл и затем удалить содержимое директории по этому списку.
Удаление через perl readdir
$ perl -e ‘chdir «/mnt/test_dir/» or die; opendir D, «.»; while ($n = readdir D) < unlink $n >‘ (взял здесь)
Под strace один раз вызывает getdents() , потом много раз unlink() и так в цикле. Занял 380Кб памяти, не растет.
Удаляет успешно.
Получается, что использование readdir вполне возможно?
Удаление через программу на C readdir + unlink
$ gcc -o cleandir cleandir.c
$ ./cleandir
Под strace один раз вызывает getdents() , потом много раз unlink() и так в цикле. Занял 128Кб памяти, не растет.
Удаляет успешно.
Опять — же, убеждаемся, что использовать readdir — вполне нормально, если не накапливать результаты в памяти, а удалять файлы сразу.
Источник
Как обрезать файлы до нулевого размера в Linux
How to Truncate (Empty) Files in Linux
В этом руководстве объясняется, как обрезать файлы до нулевого размера в системах Linux с помощью перенаправления оболочки и truncate команды.
В некоторых ситуациях может потребоваться усечь (очистить) существующий файл до нулевой длины. Проще говоря, усечение файла означает удаление содержимого файла без удаления файла.
Усечение файла происходит намного быстрее и проще, чем удаление файла , его воссоздание и установка правильных прав доступа и владельца . Кроме того, если файл открывается процессом, удаление файла может привести к сбою в работе программы, которая его использует.
Shell Redirection
Самый простой и наиболее используемый метод для усечения файлов — это использование > — оператора перенаправления оболочки.
Общий формат для усечения файлов с использованием перенаправления:
- В : средстве толстой кишки true и не производит никакого вывода.
- Оператор > перенаправления перенаправляет вывод предыдущей команды в указанный файл.
- filename , файл, который вы хотите усечь.
Если файл существует , он будет обрезан до нуля. В противном случае файл будет создан.
Вместо : можно также использовать другую команду, которая не выдает никаких результатов.
Вот пример использования cat команды для вывода содержимого /dev/null устройства, которое возвращает только символ конца файла:
Еще одна команда, которая может быть использована echo . -n Опция говорит echo не для добавления новой строки:
В большинстве современных оболочек, таких как Bash или Zsh, вы можете опустить команду перед символом перенаправления и использовать:
Чтобы иметь возможность обрезать файл, вам необходимо иметь права на запись в файл. Обычно вы бы использовали sudo для этого, но привилегии суперпользователя не применяются к перенаправлению. Вот пример:
Есть несколько решений, которые позволяют перенаправлять с sudo . Первый вариант может запустить новую оболочку с помощью sudo и выполнить команду внутри этой оболочки, используя -c флаг:
Другой вариант — передать вывод в tee команду, повысить tee привилегии sudo и записать пустой вывод в заданный файл:
truncate команда
truncate утилита командной строки, которая позволяет уменьшить или расширить размер файла до заданного размера.
Общий синтаксис для усечения файлов до нулевого размера с помощью truncate команды, выглядит следующим образом:
Например, чтобы очистить журнал доступа Nginx, вы должны использовать:
Очистить все файлы журнала
Со временем ваш диск может загромождаться большим количеством больших файлов журнала, занимающих много места на диске.
Следующая команда очистит файлы, заканчивающиеся на «.log» в /var/log каталоге:
Лучшим вариантом будет вращение, сжатие и удаление файлов журналов с помощью logrotate инструмента.
Вывод
Чтобы обрезать файл в Linux, используйте оператор перенаправления, > за которым следует имя файла.
Источник
Как удалить файлы и каталоги в терминале Linux?
Команды rm и rmdir удаляют файлы и каталоги в Linux, macOS и других Unix-подобных операционных системах. Они похожи на команды del и deltree в Windows и DOS. Эти команды очень мощные и имеют довольно много опций.
Важно отметить, что файлы и каталоги, удаленные с помощью rm и rmdir , не перемещаются в корзину. Они сразу же удаляются с вашего компьютера. Если вы случайно удалили файлы с помощью этих команд, вы сможете восстановить их только из резервной копии.
Как удалить файлы с помощью rm
Самый простой случай — это удаление одного файла в текущем каталоге. Введите команду rm, пробел, а затем имя файла, который вы хотите удалить.
Если файл не находится в текущем рабочем каталоге, укажите путь к местоположению файла.
Вы можете передать более одного имени файла в rm. При этом удаляются все указанные файлы.
Подстановочные знаки могут использоваться для выбора групп файлов, которые будут удалены. Знак * представляет несколько символов, а символ ? представляет один символ. Эта команда удалит все файлы изображений png в текущем рабочем каталоге.
Эта команда удалит все файлы с одним символьным расширением. Например, это удалит File.1 и File.2, но не File.12.
Если файл защищен от записи, вам будет предложено удалить файл. Вы должны ответить с помощью y или n и нажать «Enter».
Чтобы снизить риск использования rm с подстановочными знаками, используйте параметр -i (интерактивный). Для этого необходимо подтвердить удаление каждого файла.
Опция -f (сила) противоположна интерактивной. Он не запрашивает подтверждение, даже если файлы защищены от записи.
Как удалить каталоги с помощью rm
Чтобы удалить пустой каталог, используйте опцию -d (directory). Вы можете использовать подстановочные знаки (* и ?) В именах каталогов так же, как и в именах файлов.
Предоставление более одного имени каталога удаляет все указанные пустые каталоги.
Чтобы удалить не пустые каталоги, используйте параметр -r (рекурсивный). Чтобы было ясно, это удаляет каталоги и все файлы и подкаталоги, содержащиеся в них.
Если каталог или файл защищен от записи, вам будет предложено подтвердить удаление. Чтобы удалить не пустые каталоги и подавить эти приглашения, используйте вместе параметры -r (рекурсивный) и -f (принудительный).
Здесь требуется осторожность. Ошибка в команде rm -rf может привести к потере данных или неисправности системы. Это опасно, и осторожность — лучшая политика. Чтобы получить представление о структуре каталогов и файлах, которые будут удалены командой rm -rf, используйте команду tree .
Используйте apt-get для установки этого пакета в вашу систему, если вы используете Ubuntu или другой дистрибутив на основе Debian. В других дистрибутивах Linux используйте инструмент управления пакетами вашего дистрибутива Linux.
Выполнение команды tree дает простую для понимания диаграмму структуры каталогов и файлов под каталогом, из которого она запускается.
Вы также можете указать путь к команде tree чтобы он запускал дерево из другого каталога в файловой системе.
Команда rm также имеет параметры —one-file-system , —no-preserve-root , —preserve-root , но они рекомендуются только для опытных пользователей. Если вы что-то не так, вы можете случайно удалить все ваши системные файлы.
Как удалить каталоги с помощью rmdir
Есть еще одна команда rmdir , которую вы можете использовать для удаления каталогов. Разница между rm и rmdir том, что rmdir может удалять только пустые каталоги. Он никогда не удалит файлы.
Самый простой случай — удаление одного пустого каталога. Как и в случае с rm , вы можете передать несколько имен каталогов в rmdir или rmdir путь к каталогу.
Удалите один каталог в текущем каталоге, передав его имя в rmdir :
Удалите несколько каталогов, передав список имен в rmdir :
Удалите каталог не в текущем каталоге, указав полный путь к этому каталогу:
Если вы попытаетесь удалить не пустую папку, rmdir выдаст вам сообщение об ошибке. В следующем примере rmdir успешно и без вывода сообщений удаляет каталог clients но отказывается удалять каталог projects поскольку он содержит файлы. Каталог projects остается точно таким, каким он был, а файлы в нем нетронутыми.
Когда rmdir выдает ошибку «Directory not empty», он прекращает обработку каталогов, переданных ему в командной строке. Если вы попросили удалить четыре каталога, а в первом содержались файлы, rmdir выдаст вам сообщение об ошибке и больше ничего не сделает. Вы можете заставить его игнорировать эти ошибки с —ignore-fail-on-non-empty чтобы обрабатывать другие каталоги.
В следующем примере две папки были переданы в rmdir , это work/reports и work/quotes. Параметр —ignore-fail-on-non-empty включен в команду. В папке work/reports находятся файлы, поэтому rmdir не может удалить ее. Опция —ignore-fail-on-non-empty заставляет rmdir игнорировать ошибку и переходить к следующей папке, которую он должен обработать, это work/quotes. Это пустая папка, и rmdir удаляет ее.
Эта команда использовалась.
Вы можете использовать опцию -p (parent), чтобы удалить каталог, а также удалить его родительские каталоги. Этот прием работает, потому что rmdir начинается с целевого каталога, а затем возвращается к родительскому. Теперь этот каталог должен быть пустым, поэтому он может быть удален rmdir, и процесс повторяет шаг назад по пути, предоставленному rmdir.
В следующем примере команда, переданная в rmdir:
Каталоги invoices и work удаляются по запросу.
Используете ли вы Bash или любую другую оболочку? Linux предоставляет гибкие и мощные команды для удаления каталогов и файлов прямо из командной строки терминала. Некоторые люди предпочитают иметь рабочий процесс, который вращается вокруг терминала. У других может не быть выбора в этом вопросе. Они могут работать на серверах без установленного графического интерфейса или в удаленном сеансе в автономной системе, такой как Raspberry Pi. Эти команды идеально подходят для этой группы людей.
Но какой бы тип рабочего процесса вы ни предпочли, эти команды очень хорошо подходят для включения в сценарии оболочки. Если сценарий запускается заданием cron , это может помочь автоматизировать рутинные служебные задачи, такие как очистка нежелательных файлов журнала. Если вы исследуете этот вариант использования, помните о силе этих команд, тщательно проверяйте все и всегда сохраняйте последнюю резервную копию.
Источник