Русский (Russian)

Удаление файла и папки в Linux из командной строки

3 min
VPS/VDS-хостинг

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

Предварительные требования

  • Доступ к оболочке на машине с Linux (локально или по SSH), например на VPS с Linux
  • Пользователь с правами на запись в нужный каталог (или sudo)
  • Свежая резервная копия всего важного

Проверьте цель перед удалением

Перейдите в нужный каталог и выведите его содержимое. Это занимает пару секунд и предотвращает большинство аварий.

Bash
pwd ls -la

Если вы работаете с шаблоном (расширение, префикс), сначала посмотрите, что он затронет. Команда rm получит в точности тот же список.

Bash
ls -d *.log

Удалите файл

Основная команда - rm.

Bash
rm report.txt

Добавьте -i, чтобы она запрашивала подтверждение, и -v, чтобы она выводила, что именно удаляет.

Bash
rm -iv report.txt

Затем проверьте результат командой ls report.txt: сообщение «No such file or directory» подтверждает, что файл удалён.

Удалите несколько файлов

Подстановочные символы оболочки позволяют выбрать сразу набор файлов. Сначала выведите список через ls, затем удаляйте.

Bash
rm -v *.tmp rm -v photo_{01..05}.jpg

Избегайте «голой» звёздочки вроде rm * в каталоге, в содержимом которого вы не уверены. Если имя файла начинается с дефиса, используйте --, чтобы обозначить конец опций:

Bash
rm -- -strange-file.txt

Удалите пустой каталог

rmdir удаляет только пустые каталоги. Так задумано: это защита от ошибок.

Bash
rmdir old_folder

Чтобы заодно удалить родительские каталоги, которые после этого опустели:

Bash
rmdir -p project/cache/tmp

Удалите каталог со всем содержимым

Здесь нужна рекурсивная опция -r. Сначала оцените, что именно вы потеряете.

Bash
du -sh old_project find old_project -type f | wc -l

Затем удалите с подтверждением:

Bash
rm -ri old_project

Если файлов тысячи, подтверждения становятся неудобными. Опция -f отключает их:

Bash
rm -rf old_project

Никогда не подставляйте в эту команду непроверенную переменную. В rm -rf "$DIR"/ при пустой $DIR целью окажется корневой каталог. В скриптах добавляйте set -u или используйте "${DIR:?}": это прервёт выполнение, если переменная пуста.

Удалите файлы по возрасту

find фильтрует по точным критериям (имя, тип, возраст, размер). Принцип такой: сначала запустите команду без действия, затем добавьте -delete.

Bash
find /var/log/myapp -type f -name "*.log" -mtime +30

Если список совпадает с ожидаемым:

Bash
find /var/log/myapp -type f -name "*.log" -mtime +30 -delete

-mtime +30 означает файлы, изменённые более 30 дней назад. Ставьте -delete последним: find вычисляет условия слева направо, и -delete, поставленный слишком рано, удалит всё подряд.

Надёжно сотрите конфиденциальный файл

rm удаляет запись о файле, но не обязательно сами данные на диске. shred перезаписывает содержимое перед удалением.

Bash
shred -u -v secret.key

У этого метода есть ограничения на SSD, в журналируемых файловых системах и на томах со снимками (snapshots): старые данные там могут сохраниться. Для действительно чувствительной информации надёжное решение - шифровать диск с самого начала.

Исправьте типичные ошибки

Permission denied

У вас нет права записи в родительский каталог (именно он управляет удалением, а не сам файл). Проверьте командой ls -ld DIRECTORY, затем при необходимости используйте sudo:

Bash
sudo rm -v /path/to/file

Operation not permitted даже с sudo

Вероятнее всего, у файла установлен атрибут неизменяемости. Посмотрите атрибуты, снимите его и удалите файл.

Bash
lsattr file.txt sudo chattr -i file.txt sudo rm file.txt

Argument list too long

Подстановка создала больше аргументов, чем принимает система. Воспользуйтесь find, который обрабатывает файлы по одному:

Bash
find . -maxdepth 1 -type f -name "*.tmp" -delete

Directory not empty или Device or resource busy

Первое сообщение от rmdir нормально: в каталоге есть файлы, в том числе скрытые (ls -A). Если каталог занят точкой монтирования или процессом, выясните это с помощью lsof +D DIRECTORY или findmnt, освободите его и повторите попытку.

Чтобы потренироваться без риска, удобен временный сервер: на VPS можно создать тестовый каталог и ошибаться без последствий. Другие руководства такого рода собраны в разделе обучающих материалов.

FAQ

Можно ли восстановить файл, удалённый через rm?

Редко и без гарантий. Такие инструменты, как extundelete или testdisk, иногда находят данные, если сразу прекратить запись на диск. Единственная надёжная защита - резервная копия.

В чём разница между rm -r и rm -rf?

rm -r удаляет рекурсивно, но запрашивает подтверждение для файлов, защищённых от записи. rm -rf принудительно удаляет и молча игнорирует несуществующие файлы. Используйте его, только когда уже проверили цель.

Как удалить каталог, в имени которого есть пробелы?

Возьмите имя в кавычки или экранируйте пробелы: rm -r "My folder" или rm -r My\ folder. Иначе оболочка воспримет каждое слово как отдельный аргумент.

Есть ли корзина в командной строке?

Да, это пакет trash-cli (команда trash-put): он перемещает элементы в корзину пользователя вместо удаления. На сервере он обычно не установлен по умолчанию, поэтому приучите себя сначала выводить список, а потом удалять.

Следите за последними предложениями, скидками и специальными акциями.

Смотреть акции

Мы используем файлы cookie

Аналитические cookie улучшают работу сайта. Данные не продаются третьим лицам. Подробнее в политике конфиденциальности.