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

Обновлено: 02.07.2024

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

Как использовать rm команду

Общий синтаксис команды rm (удалить) следующий:

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

Чтобы удалить один файл, используйте rm команду с именем файла в качестве аргумента:

Если файл не защищен от записи, он будет удален без уведомления. В случае успеха команда не выдает никаких результатов и возвращает ноль.

При удалении защищенных от записи файлов команда запросит подтверждение, как показано ниже:


Введите y и нажмите, Enter чтобы удалить файл.

-f Опция говорит rm никогда не предложит пользователю и игнорировать несуществующие файлы и аргументы.


Если вы хотите получить информацию о том, что удаляется, используйте -v (подробный) вариант:

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

В отличие от unlink команды, rm позволяет удалить несколько файлов одновременно. Для этого передайте имена файлов в качестве аргументов через пробел:


Вы можете использовать регулярные выражения для сопоставления нескольких файлов. Например, чтобы удалить все .jpg файлы в текущем каталоге, введите:


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

Удаление каталогов (папок)

Чтобы удалить один или несколько пустых каталогов, используйте -d параметр:


rm -d функционально идентичен rmdir команде.

Чтобы удалить непустые каталоги и все файлы внутри них рекурсивно, используйте -r (рекурсивный) параметр:

Подскажите перед удалением

-i Опция указывает rm подсказывать пользователю для каждого файла перед его удалением


Чтобы подтвердить тип y и нажмите Enter :


При удалении более трех файлов или рекурсивном удалении каталога, чтобы получить одно приглашение для всей операции, используйте -I параметр:


Вам будет предложено подтвердить удаление всех указанных файлов и каталогов:

rm -rf

Если данный каталог или файл в каталоге защищен от записи, rm команда предложит вам подтвердить операцию. Чтобы удалить каталог без запроса, используйте -f параметр:


Команда rm -rf очень опасна и должна использоваться с особой осторожностью!

Вывод

Мы показали вам, как использовать команду Linux rm для удаления файлов и каталогов из вашей системы Linux.

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

В этом руководстве мы объясним, как использовать команду rm на примерах и объяснениях наиболее распространенных параметров rm .

Как использовать команду rm

Общий синтаксис команды rm (remove) следующий:

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

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

Если у вас нет прав на запись в родительский каталог, вы получите ошибку «Операция запрещена».

Если файл не защищен от записи, он будет удален без уведомления. В случае успеха команда не производит никакого вывода и возвращает ноль.

При удалении файлов, защищенных от записи, команда запросит подтверждение, как показано ниже:

Введите y и нажмите Enter чтобы удалить файл.

Параметр -f указывает rm никогда не запрашивать пользователя и игнорировать несуществующие файлы и аргументы.

Если вы хотите получить информацию о том, что удаляется, используйте параметр -v (подробный):

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

В отличие от команды unlink , rm позволяет удалить сразу несколько файлов. Для этого передайте имена файлов в качестве аргументов, разделенных пробелом:

Вы можете использовать регулярные выражения для сопоставления нескольких файлов. Например, чтобы удалить все файлы .jpg в текущем каталоге, введите:

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

Удаление каталогов (папок)

Чтобы удалить один или несколько пустых каталогов, используйте параметр -d :

rm -d функционально идентична команде rmdir .

Чтобы рекурсивно удалить непустые каталоги и все файлы в них, используйте параметр -r (рекурсивный):

Запрашивать перед удалением

Параметр -i указывает rm запрашивать пользователя для каждого заданного файла перед его удалением:

Для подтверждения введите y и нажмите Enter :

При удалении более трех файлов или рекурсивном удалении каталога, чтобы получить одно приглашение для всей операции, используйте параметр -I :

Вам будет предложено подтвердить удаление всех указанных файлов и каталогов:

rm -rf

Если данный каталог или файл в каталоге защищен от записи, команда rm предложит вам подтвердить операцию. Чтобы удалить каталог без запроса, используйте параметр -f :

Команда rm -rf очень опасна и должна использоваться с особой осторожностью!

Выводы

Мы показали вам, как использовать команду Linux rm для удаления файлов и каталогов из вашей системы Linux.

Будьте предельно осторожны при удалении важных файлов или каталогов, поскольку после удаления файла его будет нелегко восстановить.


Команда rm в Linux

По умолчанию команда rm не удаляет директории. Чтобы удалить директорию и все ее содержимое, включая вложенные директории, нужно использовать опцию -r (рекурсивное удаление).

Синтаксис

файл(ы) — один или несколько файлов и/или директорий, записанных через пробел. Можно использовать шаблон (например, *.txt ).

Опции

Игнорировать несуществующие файлы и аргументы. Никогда не выдавать запросы на подтверждение удаления. Выводить запрос на подтверждение удаления каждого файла. Выдать один запрос на подтверждение удаления всех файлов, если удаляется больше трех файлов или используется рекурсивное удаление. Опция применяется, как более «щадящая» версия опции -i
  • never — никогда не выдавать запросы на подтверждение удаления.
  • once — выводить запрос один раз (аналог опции -I ).
  • always — выводить запрос всегда (аналог опции -i ).

Если значение КОГДА не задано, то используется always

Во время рекурсивного удаления пропускать директории, которые находятся на других файловых системах. Если в качестве директории для удаления задан корневой раздел / , то считать, что это обычная директория и начать выполнять удаление. Если в качестве директории для удаления задан корневой раздел / , то запретить выполнять команду rm над корневым разделом. Данное поведение используется по умолчанию. Удаление директорий и их содержимого. Рекурсивное удаление.

Примечание

Если нужно удалить файл, название которого начинается с символа - , например, файл -myfile , то используется следующая команда:

Примеры использования команды rm

Удалить файл

Чтобы удалить файл с помощью команды rm достаточно указать название файла:

Можно удалить несколько файлов, перечислив их имена через пробел:

Принудительно удалить защищенный файл

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

Удалить все файлы в текущей директории

Чтобы удалить все файлы в текущей директории можно использовать шаблонную запись звездочка *

Выдавать запрос перед удалением каждого файла

Чтобы перед удалением каждого файла выводилось подтверждение на удаление данного файла, используется опция -i

Выдать запрос на удаление один раз

При использовании опции -I выводится всего один запрос на подтверждение удаления файлов, причем, только если удаляемых файлов четыре и более. Если файлов 3, или 2, или 1, то запрос не выводится.

Команда RM. Запрос на удаление файлов

Удалить директорию и ее содержимое

Для удаления директорий и их содержимого используется опция -r . Удалим директорию mydir и все файлы и директории внутри нее:

у меня есть этот список файлов внутри Linux server:

Я удаляю выбранные файлы журнала один за другим, используя команду rm -rf см. ниже:

есть ли другой способ, чтобы я мог удалить выбранные файлы сразу??

Bash поддерживает все виды подстановочных знаков и расширений.

ваше точное дело будет обрабатываться фигурные скобки, например:

больше расширить до одна команда со всеми тремя аргументами и эквивалентна набору:

важно отметить, что это расширение выполняется оболочкой, прежде чем rm еще загружен.

использовать подстановочный знак ( * ) для выбора нескольких файлов.

например, следующая команда удаляет все файлы с именами, начинающимися с abc.log.2012-03- .

Я бы рекомендовал под управлением ls abc.log.2012-03-* чтобы перечислить файлы, чтобы вы могли видеть, что вы собираетесь удалить перед запуском .

для получения более подробной информации см. страницу bash man на расширение имени файла.

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

регулярные выражения более мощные, чем подстановочные знаки; вы можете кормить вывод grep to rm -f . Например, если некоторые имена файлов начинаются с "abc.log" и с "ABC.log" , grep можно сделать без учета регистра:

когда я это делаю, я запускаю сначала проверьте, что он выдает результат, который я хочу -- особенно если я использую rm -f :

здесь !! расширяется до предыдущей команды. Или я могу ввести стрелку вверх или Ctrl-P и отредактировать предыдущую строку, чтобы добавить .

это предполагает, что вы используете оболочку Bash. Некоторые другие оболочки, особенно csh и tcsh и некоторые более старые оболочки SH, могут не поддерживать $(. ) синтаксис. Вы можете использовать эквивалентный backtick синтаксис:

на $(. ) синтаксис легче читать, и если вы действительно амбициозны, он может быть вложен.

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

затем я могу отредактировать list файл вручную, оставляя только файлы, которые я хочу удалить, и затем:

(предполагается, что ни одно из имен файлов не содержит забавных символов, особенно пробелов.)

или, при редактировании list файл, я могу добавить rm -f в начале каждой строки, а затем:

дикая карта будет хорошо работать для этого, хотя для безопасности было бы лучше использовать дикую карту как можно меньше, поэтому что-то вроде этого:

хотя, судя по всему, это только отдельные файлы? Рекурсивный параметр не должен быть необходим, если ни один из этих элементов не является каталогами, поэтому лучше не использовать его, просто для безопасности.

просто используйте многострочный выбор в sublime, чтобы объединить все файлы в одну строку и добавить пробел между каждым именем файла, а затем добавить rm в начале списка. Это в основном полезно, когда в именах файлов, которые вы хотите удалить, нет шаблона.

Я не гуру linux, но я считаю, что вы хотите передать свой список выходных файлов в xargs rm -rf . Я использовал нечто подобное в прошлом с хорошими результатами. Сначала проверьте пример каталога!

EDIT - возможно, я неправильно понял, основываясь на других ответах, которые появляются. Если вы можете использовать подстановочные знаки, отлично. Я предположил, что ваш исходный список, который вы отобразили, был сгенерирован программой, чтобы дать вам ваш "выбор", поэтому я подумал, что xargs был бы путь к идти.

Если вы хотите удалить все файлы, которые относятся к каталог сразу. Например; имя каталога yor - "log", а каталог" log " включает abc.бревно.2012-03-14, abc.бревно.2012-03-15. файлы ect. Вы должны быть над каталогом журнала и



Феерическая расстановка точек над 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 говорит, что не нужно сортировать список файлов.
Создает такую иерархию процессов:

Удаление через 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 — вполне нормально, если не накапливать результаты в памяти, а удалять файлы сразу.

Читайте также: