Команда Linux rm
В Linux команда rm (remove) используется для удаления файлов. Они удаляются навсегда поэтому следует соблюдать осторожность и желательно иметь резервные копии.
Содержание
Синтаксис
Опции
По умолчанию каталоги не удаляются. Используйте параметр —recursive ( -r или -R ), чтобы удалить все перечисленные каталоги вместе с их содержимым.
Для удаления файла, начинающегося с — (например: -foo ), используйте одну из следующих команд:
- rm — -foo
- rm ./-foo
Заметим, что при использовании утилиты для удаления файла, обычно, его содержимое можно восстановить, имея соответствующий опыт и время.
Примеры использования в Linux команды rm
Удаление файла
В каталоге Directory был создан файл examle :
Для удаления файла команде опции не нужны:
Удаление нескольких файлов
В этом же каталоге были созданы файлы example_1 , example_2 , example_3 :
Для удаления файлов их можно просто перечислить:
Интерактивное удаление файла
Если вы хотите получать запрос на подтверждение удаления файла, то используйте опцию -i :
При запросе подтверждения вводите y для удаления файла, либо n для прерывания выполнения команды.
Удаление защищённого файла
В каталоге Directory создан файл example , защищённый от записи:
В любом дистрибутиве Linux команда запросит подтверждения на удаление, но с опцией -f файл удаляется без предупреждения:
Удаление каталога
Команда может использоваться для рекурсивного удаления каталога и его содержимого:
Удаление содержимого каталога
Для удаления содержимого каталога команда используется с подстановочным символом * :
Удаление пустого каталога
Для удаления пустого каталога команда используется с опцией -d :
Использование подстановочных символов
В качестве примера были созданы несколько файлов:
В данном примере файлы, имена которых оканчиваются на .txt , удаляются следующим образом:
Файлы, имена которых начинаются с linux , удаляются так:
Заключение
Команда Linux rm является одной из базовых утилит. Она позволяет вам удалять файлы и каталоги. В этой статье мы рассмотрели некоторые титичные примеры.
Как удалить файл через терминал Linux
Эта небольшая заметка ориентирована на совсем начинающих. Сегодня мы рассмотрим как удалить файл linux через терминал. Для более опытных пользователей это элементарная задача, но новичкам надо с чего-то начинать. Знать как работать с файлами в консоли очень важно.
К тому же удаление из консоли дает много преимуществ и большую гибкость. Например, с помощью специальной команды вы можете полностью стереть файл с жесткого диска, так что его уже ни за что невозможно будет восстановить или одной командой с помощью специальных символов, условий или регулярных выражений удалить сотни ненужных файлов в одном каталоге или подкаталогох соответствующих определенному критерию.
В Linux для удаления файлов предусмотрена стандартная утилита rm. Как и все остальные, стандартные утилиты в имени rm тоже заложена определенная идея. Это сокращение от английского слова Remove.
Удаление файлов в Linux
Чтобы удалить файл linux достаточно передать в параметрах команде адрес файла в файловой системе:
Чтобы удалить все файлы, начинающиеся на слово file можно использовать специальный символ *, означает любой символ в любом количестве:
Эта команда удаления файла в linux должна использоваться очень осторожно, чтобы не удалить ничего лишнего. В утилите есть опция -i, которая заставляет программу спрашивать пользователя перед тем, как удалить файл linux:
rm: удалить пустой обычный файл «/home/user/file»?
Если файлов очень много, вы уверены в правильности команды и отвечать каждый раз y неудобно, есть противоположная опция — f. Будут удалены все файлы без вопросов:
rm -f /home/user/file*
Для удаления директорий, вместе с файлами и поддиректориями используется опция -R, например:
rm -Rf /home/user/dir
Будет удалено все что находиться в папке dir, и эта папка. Только будьте бдительны, чтобы не получился знаменитый патч Бармина:
Не стоит выполнять эту команду в своей системе, как видите, она удаляет все файлы в файловой системе Linux.
Удаление файла в linux также возможно с помощью утилиты find. Общий синтаксис find:
find папка критерий действие
Например, мы хотим удалить файл linux по имени:
find . -type f -name «file» -exec rm -f <> \;
Будут найдены все файлы с именем file в текущей папке и для них вызвана команда rm -f. Можно не вызывать стороннюю утилиту, а использовать действие delete:
find . -type f -name «file» -delete
Удалить все файлы в текущей директории, соответствующие определенному регулярному выражению:
find . -regex ‘\./[a-f0-9\-]\.bak’ — delete
Или удалить файлы старше определенного строка, может быть полезно для удаления старых логов:
find /path/to/files* -mtime +5 -exec rm <> \;
Будет выполнено удаление файлов через терминал все файлы в папке старше 5-ти дней.
Чтобы полностью стереть файл, без возможности восстановления используйте команду shred. Во время удаления файлов с помощью утилиты rm удаляется только ссылка на файл, само же содержимой файла по-прежнему находиться на диске, пока система не перезапишет его новыми данными, а пока этого не случится файл можно легко восстановить. Принцип действия утилиты такой — после удаления файла, его место на диске несколько раз перезаписывается.
Опцией -n — можно указать количество перезаписей диска, по умолчанию используется 3. А если указать опцию -z программа при последней перезаписи запишет все нулями чтобы скрыть, уничтожение файла.
Выводы
Вот и все. Теперь вы знаете как удалить файл в Ubuntu, как видите, делать это не так уж сложно. Если у вас остались вопросы, пишите в комментариях!
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
How to delete multiple files at once in Bash on Linux?
I’ve been deleting selected log files one by one, using the command rm -rf see below:
Is there another way, so that I can delete the selected files at once?
7 Answers 7
Bash supports all sorts of wildcards and expansions.
Your exact case would be handled by brace expansion, like so:
The above would expand to a single command with all three arguments, and be equivalent to typing:
It’s important to note that this expansion is done by the shell, before rm is even loaded.
Use a wildcard ( * ) to match multiple files.
For example, the command below will delete all files with names beginning with abc.log.2012-03- .
I’d recommend running ls abc.log.2012-03-* to list the files so that you can see what you are going to delete before running the rm command.
For more details see the Bash man page on filename expansion.
If you want to delete all files whose names match a particular form, a wildcard (glob pattern) is the most straightforward solution. Some examples:
Regular expressions are more powerful than wildcards; you can feed the output of grep to rm -f . For example, if some of the file names start with "abc.log" and some with "ABC.log" , grep lets you do a case-insensitive match:
This will cause problems if any of the file names contain funny characters, including spaces. Be careful.
When I do this, I run the ls | grep . command first and check that it produces the output I want — especially if I’m using rm -f :
where !! expands to the previous command. Or I can type up-arrow or Ctrl-P and edit the previous line to add the rm -f command.
This assumes you’re using the bash shell. Some other shells, particularly csh and tcsh and some older sh-derived shells, may not support the $(. ) syntax. You can use the equivalent backtick syntax:
The $(. ) syntax is easier to read, and if you’re really ambitious it can be nested.
Finally, if the subset of files you want to delete can’t be easily expressed with a regular expression, a trick I often use is to list the files to a temporary text file, then edit it:
I can then edit the list file manually, leaving only the files I want to remove, and then:
(Again, this assumes none of the file names contain funny characters, particularly spaces.)
Or, when editing the list file, I can add rm -f to the beginning of each line and then:
Editing the file is also an opportunity to add quotes where necessary, for example changing rm -f foo bar to rm -f ‘foo bar’ .
linux удаление большого количества файлов
Как удалить сразу несколько файлов в Bash на Linux?
у меня есть этот список файлов внутри Linux server:
есть ли другой способ, чтобы я мог удалить выбранные файлы сразу??
7 ответов
Bash поддерживает все виды подстановочных знаков и расширений.
ваше точное дело будет обрабатываться фигурные скобки, например:
больше расширить до одна команда со всеми тремя аргументами и эквивалентна набору:
важно отметить, что это расширение выполняется оболочкой, прежде чем rm еще загружен.
использовать подстановочный знак ( * ) для выбора нескольких файлов.
для получения более подробной информации см. страницу bash man на расширение имени файла.
если вы хотите удалить все файлы, имена которых соответствуют определенной форме, по шаблону (шаблон Глоб) является наиболее простым решением. Некоторые примеры:
затем я могу отредактировать list файл вручную, оставляя только файлы, которые я хочу удалить, и затем:
(предполагается, что ни одно из имен файлов не содержит забавных символов, особенно пробелов.)
дикая карта будет хорошо работать для этого, хотя для безопасности было бы лучше использовать дикую карту как можно меньше, поэтому что-то вроде этого:
хотя, судя по всему, это только отдельные файлы? Рекурсивный параметр не должен быть необходим, если ни один из этих элементов не является каталогами, поэтому лучше не использовать его, просто для безопасности.
просто используйте многострочный выбор в sublime, чтобы объединить все файлы в одну строку и добавить пробел между каждым именем файла, а затем добавить rm в начале списка. Это в основном полезно, когда в именах файлов, которые вы хотите удалить, нет шаблона.
Быстрое удаление каталога с огромным количеством вложенных файлов и подкаталогов
Столкнулся с проблемой следующего рода:
Имеется каталог, с большим количеством подкаталогов и уровнем вложенности который определить не представляется возможным.
Общий размер каталога около 20Гб, количество файлов более 10 млн. Точное количество файлов определить не хватило терпения (более 3 часов ждал, не долждался), а размер определил методом: вычесть из общего размера занятого на диске размер прочих каталогов, чей размер определить удалось.
Задача: удалить этот каталог со всем его содержимым за минимальный промежуток времени и с минимальным износом ЖД (все это дело на ноутбуке).
Может кто другие, более производительные методы подскажет?
перенести все остальное на другой винт, а этот форматнуть и впредь так не делать
подробнее пожалуйста, если можно?
а) +1 за идею забэкапить все кроме этого каталога, снести все нафиг, восстановить все кроме каталога
А по inode-у удалить разве нельзя? Грохни inode каталога и все, прощай файлики. How to: Linux / UNIX Delete or Remove Files With Inode Number
ждал 3 часа, освободило не более 3 Гб
Ну подожди еще сутки. Можно подумать, ты эти три часа педали крутил чтоб оно удалялось.
Ну, или для Ъ — rsync
Стандартное решение: unlink верхней директории, следом umount и fsck.
unlink не работает с каталогами
Дык, я только что сидел, пытался. Оказывается, поломали, сволочи!
Надо восстановить справедливость и пропатчить glibc, чтобы unlink перестал проверять, является ли хрень по указанному адресу директорией, если его запускают от рута.
или ты имел в виду сискол?
Да пофиг. Главное — поломали же такую классную вещь.
потом fsck скажет что ему вусмерть надо поработать и вернет всё в lost+found
Чушь. И да, на reiserfs нет директории lost&found!
А про износ диска ТС-у никто не ответил. Может ему нужно перемонтировать ФС или что написать в /proc, чтобы было усиленное кеширование записи?
Такое вытворял не я, а человек работавший ранее на этом рабочем месте. Сносить все это хозяйство опять же не предоставляется возможным, слишком много инфы + / & /home в одном разделе, так что.
Я не думаю, что разовое удаление такого каталога заметно скажется на износе диска.
А вот если задача становится многократно, я бы посоветовал посмотреть в сторону reisrefs. Мне часто приходится работать с кешами, когда несколько десятков или сотен тысяч файлов на несколько гигабайт или десятков гигабайт лежат в на 2-3 уровнях вложенности в подкаталогах. ext4 на такой структуре через какое-то время использования становится адом. Я несколько лет мучился, пока не рискнул reisrefs проверить, памятуя, что лет 10-15 назад серьёзных проблем с такими структурами (с небольшими поправками на развитие железа) у меня не было. А вправду, одна только синхронизация по rsync на таких объёмах, занимая на ext4 десяток минут, на reiserfs отрабатывает за минуту. Даже (на машинах без lvm, когда легко не переразбить диск) быстрее оказывается в плане скорости поставить reisrefs в файл-образ на ext4.
Удалить миллионы файлов в linux
Как удалить миллионы файлов в linux? Проблемам достаточно известная и, самое главное, не так проста как кажется. Симптомы:
При наличии в одном каталоге нужных нам файлов и ненужных, мы вынуждены удалять файлы по маске, и тут кроется основная проблема большинство консольных утилит не в состояние выдать вам столь весомый список, а следствие этого и работать с ним. Первым отваливается rm который вам заявляет что слишком большой массив данных.
При определенном условие все еще отрабатывает такой хитрый вариант как
Оптимизировав его мы можем добавить еще пару сотен тысяч файлов и опять же у нас появится та же проблема, слишком большой массив данных.
Основная проблема в том, что мне нужно удалить именно данный файл, а не всю папку или все файлы находящиеся в ней. В результате для удаления 14 000 000 файлов мне потребовалось сделать ход конем в первую очередь отказаться от регулярок, поскольку они требуют построения всего дерева. И отказаться от любых утилит, составляющих весь список в пользу построчного построения. Используем тот же find
Далее, после получения файла, в моем случае он было около 200 мегабайт, подставляем ко всем
Естественно, вариант смотрится достаточно страшно, и не оптимально. Но он помог мне решить задачу которая не поддалась никаким другим вариантам.
Самое главное в find не должно быть никаких регулярок! В противном случае он так же откажется работать, все что нам потребуется отсортируем уже в файле. Ну и напоследок не доводите до такого, в моем случае не удалялись сессии. Естественно, после формирования файла с командами нам потребуется их исполнить
Linux удаление большого количества файлов
Под strace несколько раз подряд (. ) вызывает getdents(), затем очень много вызывает unlinkat() и так в цикле. Занял 30Мб RAM, не растет. Удаляет содержимое успешно.
5919 be/0 root 80.77 M/s 16.48 M/s 0.00 % 80.68 % [loop0]
Запускает дочерний процесс шелла, который дорос до 600Мб, прибил по ^C. Ничего не удалил.
Очевидно, что glob по звёздочке обрабатывается самим шеллом, накапливается в памяти и передается команде rm после того как считается директория целиком.
Под strace вызывает только getdents(). процесс find вырос до 600Мб, прибил по ^C. Ничего не удалил.
find действует так же, как и * в шелле — сперва строит полный список в памяти.
Процесс в памяти вырос до 600Мб, прибил по ^C. Ничего не удалил.
Аналогично предыдущей команде. И это крайне удивительно! На эту команду я возлагал надежду изначально.
iotop # сильно скачет
5919 be/0 root 5.87 M/s 6.28 M/s 0.00 % 89.15 % [loop0]
Удаление через perl readdir
Под strace один раз вызывает getdents(), потом много раз unlink() и так в цикле. Занял 380Кб памяти, не растет. Удаляет успешно.
5919 be/0 root 11.18 M/s 1438.88 K/s 0.00 % 93.85 % [loop0]
Получается, что использование readdir вполне возможно?
Удаление через программу на C readdir + unlink
Код программы на С (файл cleandir.c):
int main(int argc, char *argv[]) d_name, «.») && strcmp(entry->d_name, «..») )