Удалить несколько файлов Linux
Обновлено: 21.11.2024
Я удалял выбранные файлы журналов один за другим с помощью команды rm -rf, см. ниже:
Есть ли другой способ, чтобы я мог сразу удалить выбранные файлы?
Кстати, почему -rf ? Это папки? f — сила, r — рекурсия. Это будет работать, если это всего лишь файл, но имейте в виду, использование -rf каждый раз, когда вы хотите что-то удалить, очень (очень) (очень-очень) опасно. (и вам следует добавить тег «bash», потому что «linux» слишком широкий.
@BorisStitnicky - Не нужно спорить, я был совершенно невежествен, и эта ссылка дала мне уровень информации, который я искал, +1
7 ответов 7
Bash поддерживает все виды подстановочных знаков и расширений.
Точный случай будет обрабатываться раскрытием фигурных скобок, например:
Приведенное выше расширяется до одной команды со всеми тремя аргументами и эквивалентно вводу:
Важно отметить, что это расширение выполняется оболочкой еще до загрузки rm.
Используйте подстановочный знак ( * ) для сопоставления нескольких файлов.
Например, приведенная ниже команда удалит все файлы, имена которых начинаются с abc.log.2012-03- .
Я бы рекомендовал запустить ls abc.log.2012-03-*, чтобы получить список файлов, чтобы вы могли видеть, что вы собираетесь удалить, прежде чем запускать команду rm.
Подробнее см. справочную страницу Bash по расширению имени файла.
Если вы хотите удалить все файлы, имена которых соответствуют определенной форме, самым простым решением будет подстановочный знак (шаблон подстановки). Некоторые примеры:
Регулярные выражения более эффективны, чем подстановочные знаки; вы можете передать вывод grep в rm -f . Например, если имена некоторых файлов начинаются с «abc.log», а некоторые — с «ABC.log», grep позволяет выполнять поиск без учета регистра:
Это вызовет проблемы, если какое-либо из имен файлов будет содержать забавные символы, включая пробелы. Будьте осторожны.
Когда я это делаю, я запускаю команду ls | грэп . сначала введите команду и убедитесь, что она выводит нужные мне данные -- особенно, если я использую rm -f :
где !! расширяется до предыдущей команды. Или я могу набрать стрелку вверх или Ctrl-P и отредактировать предыдущую строку, добавив команду rm -f.
Это предполагает, что вы используете оболочку bash. Некоторые другие оболочки, особенно csh и tcsh, а также некоторые более старые оболочки, производные от sh, могут не поддерживать синтаксис $(. ). Вы можете использовать эквивалентный синтаксис обратной кавычки:
Синтаксис $(. ) легче читать, и если вы действительно амбициозны, его можно вложить.
Наконец, если подмножество файлов, которые вы хотите удалить, не может быть легко выражено с помощью регулярного выражения, я часто использую прием, заключающийся в том, чтобы перечислить файлы во временный текстовый файл, а затем отредактировать его:
Затем я могу отредактировать файл списка вручную, оставив только те файлы, которые хочу удалить, а затем:
(Опять же, это предполагает, что ни одно из имен файлов не содержит забавных символов, особенно пробелов.)
Или при редактировании файла списка я могу добавить rm -f в начало каждой строки, а затем:
Редактирование файла также позволяет добавить кавычки там, где это необходимо, например, изменить rm -f foo bar на rm -f 'foo bar' .
Удалить (или удалить) файл в Linux из командной строки можно с помощью команды rm. Это позволяет вам удалять более одного файла одновременно.
Кроме того, вы можете сопоставлять несколько файлов с помощью подстановочного знака (*) и обычных расширений и легко удалять их по мере необходимости.
В этом руководстве мы покажем вам, как использовать команду rm и комбинацию других команд для удаления файлов и каталогов в Linux.
Чтобы продемонстрировать это, мы создали следующие файлы.
Как удалить несколько файлов в Linux
В этом разделе мы покажем вам несколько способов одновременного удаления нескольких файлов.
1) Чтобы удалить сразу несколько файлов, используйте команду rm, за которой следует имя файла, разделенное пробелом. Это традиционный метод, используемый новичками.
2) Чтобы удалить сразу несколько файлов, используйте раскрывающуюся скобку, как показано ниже: В этом примере удаляются указанные файлы для месяца «сентябрь (09)».
3) Кроме того, вы также можете использовать следующую команду для выполнения того же действия, что и выше.
4) Чтобы удалить все журналы за месяц "Октябрь (10)", запустите:
5) Чтобы удалить все журналы за 2021 год, выполните:
Обратите внимание: чтобы удалить файлы, защищенные от записи, необходимо передать параметр «-f (force)» команде rm.
6) Вы можете использовать подстановочный знак (*) для сопоставления нескольких файлов. Например, чтобы удалить все файлы '.txt' в текущем каталоге, используйте следующую команду: Для этого хорошо подходит подстановочный знак, однако в целях безопасности лучше использовать подстановочный знак как можно реже.
7) Чтобы удалить все *.tar.gz' в указанном каталоге в Linux используйте следующую команду:
8) Чтобы удалить файлы старше 10 дней в Linux, используйте следующую команду:
9) Чтобы удалить все файлы больше определенного размера, запустите: В этом примере найдите и удалите файлы размером более 50 МБ .
10) Чтобы быстро удалить все файлы с нулевым (0) байтом, запустите:
11) Чтобы удалить все файлы меньше определенного размера, запустите: Следующая команда найдет и удалит все файлы размером меньше 10M.
12) Чтобы удалить файлы в период с «1 января 2021 г.» по «31 октября 2021 г.», выполните:
Подведение итогов
В этом руководстве мы показали вам различные способы удаления или удаления нескольких файлов одновременно в Linux. Я надеюсь, что это руководство расширит ваши возможности по удалению файлов на терминале.
У нас есть проблема, когда папка становится громоздкой из-за сотен тысяч крошечных файлов.
Файлов так много, что выполнение rm -rf возвращает ошибку, и вместо этого нам нужно сделать что-то вроде:
найти /путь/к/папке -name "filenamestart*" -type f -exec rm -f <> \;
Это работает, но очень медленно и постоянно выходит из строя из-за нехватки памяти.
Есть ли лучший способ сделать это? В идеале я хотел бы удалить весь каталог, не заботясь о содержимом внутри него.
rm -rf * в папке, вероятно, не работает из-за слишком большого количества аргументов; но как насчет rm -rf folder/, если вы все равно хотите удалить весь каталог?
Вместо того, чтобы удалять его вручную, я предлагаю разместить папку в отдельном разделе и просто размонтировать && отформатировать && перемонтировать.
Возможно, вам следует переименовать вопрос в более точное, например "Эффективно удалить большой каталог, содержащий тысячи файлов". Чтобы удалить каталог и его содержимое, рекурсия необходима по определению. Вы можете вручную отключить только сам inode каталога (вероятно, требуются привилегии суперпользователя), размонтировать файловую систему и запустить на ней fsck, чтобы восстановить неиспользуемые блоки диска, но этот подход кажется рискованным и, возможно, не будет быстрее. Кроме того, проверка файловой системы может в любом случае включать рекурсивный обход дерева файловой системы.
После того, как у меня было такое огромное файловое дерево ccache, а rm выполнялось так долго (и замедляло работу всей системы), было значительно быстрее копировать все остальные файлы из файловой системы, форматировать и копировать их обратно. С тех пор я предоставляю таким массивным маленьким файловым деревьям собственную выделенную файловую систему, поэтому вы можете напрямую использовать mkfs вместо rm .
19 ответов 19
Использование rsync удивительно быстрое и простое.
В ответе @sarath упоминается еще один быстрый выбор: Perl! Его тесты быстрее, чем rsync -a --delete .
или без статистики (спорно, нужна ли она; одни говорят, что с ней может быть быстрее, а другие говорят, что без нее быстрее):
Спасибо, очень полезно. Я использую rsync все время, я понятия не имел, что вы можете использовать его для удаления вот так. Значительно быстрее, чем rm -rf
Может ли кто-нибудь изменить выражение perl для рекурсивного удаления всех каталогов и файлов внутри каталога_to_be_deleted ?
Примечания: добавьте параметр -P в rsync для большего отображения, а также будьте осторожны с синтаксисом, косая черта в конце обязательна. Наконец, вы можете запустить команду rsync в первый раз с параметром -n, чтобы запустить пробный запуск.
Кто-то в Твиттере предложил использовать -delete вместо -exec rm -f<> \;
Это повысило эффективность команды, хотя она по-прежнему использует рекурсию для прохождения всего.
Просто предупреждение: добавление -delete к gnu find неявно включает -depth , что возвращает вас к проблеме нехватки памяти во время сканирования.
@Marki555: в редактировании вопроса указано 60 секунд для rsync -a --delete vs 43 для lsdent . Соотношение 10x было для времени ls -1 | wc -l vs time ./dentls bigfolder >out.txt (это частично справедливое сравнение из-за > file vs wc -l ).
Проблема в том, что НИ ОДНА из приведенных здесь команд на самом деле НЕ ВЫПОЛНЯЕТ желаемую операцию обхода для удаления. Код они дают? НЕ РАБОТАЕТ, как описано Marki555.
Как насчет чего-то вроде: find /path/to/folder -name "filenamestart*" -type f -print0 | xargs -0rn 20 пм -f
Вы можете ограничить количество файлов для одновременного удаления, изменив аргумент параметра -n . Также включаются имена файлов с пробелами.
Возможно, вам не нужен 20-битный параметр -n, так как xargs в любом случае должен ограничивать себя допустимыми размерами списка аргументов.
Да, вы правы. Вот примечание от man xargs : (. ) max-chars символов на командную строку (. ). Наибольшее допустимое значение зависит от системы и рассчитывается как предел длины аргумента для exec .Таким образом, опция -n предназначена для таких случаев, когда xargs не может определить размер буфера CLI или если выполняемая команда имеет некоторые ограничения.
Расширяя один из комментариев, я не думаю, что вы делаете то, что думаете.
Сначала я создал огромное количество файлов, чтобы смоделировать вашу ситуацию:
Затем я попробовал то, что, как я ожидал, потерпит неудачу, и то, что, похоже, вы делаете в вопросе:
Но это действительно работает:
Это единственное решение, которое сработало: запустите rm -Rf bigdirectory несколько раз. У меня был каталог с тысячами миллионов подкаталогов и файлов. Я даже не мог запустить ls, find или rsync в этом каталоге, потому что ему не хватило памяти. Команда rm -Rf завершалась много раз (недостаточно памяти), удаляя только часть миллиардов файлов. Но после многих попыток это, наконец, сделало свою работу. Кажется, это единственное решение, если проблема заключается в нехватке памяти.
У меня была возможность протестировать -delete по сравнению с -exec rm \\; и для меня -delete был ответом на эту проблему.
Использование -delete удалило файлы в папке из 400 000 файлов как минимум в 1000 раз быстрее, чем rm .
В статье "Как удалить большое количество файлов в Linux" говорится, что это примерно в три раза быстрее, но в моем тесте разница была гораздо более существенной.
В GNU find именно здесь пригодится -exec rm <> \+ (в частности, \+ вместо \; ), поскольку он работает как встроенный xargs без минимальных накладных расходов на конвейер и форк. Однако все же медленнее, чем другие варианты.
@dannysauer execplus был изобретен в 1988 году Дэвидом Корном из AT&T, и GNU find была последней реализацией find, в которую была добавлена поддержка — более 25 лет спустя. Кстати: разница в скорости между стандартным execplus и нестандартным -delete минимальна.
@schily, это интересно, и я большой поклонник творчества Korn. Однако ответ, который мы комментируем, предполагает, что тестирование проводилось в Linux. «Найти GNU» было указано, чтобы отличать его от других возможных минимальных реализаций Linux, таких как busybox. :)
Используйте каталог rm -rf вместо rm -rf * .
Сначала мы выполняли команду rm -rf *, находясь в каталоге, чтобы очистить содержимое, и думали, что это будет максимально быстро. Но затем один из наших старших инженеров предложил не использовать звездочки ( * ) и вместо этого передавать родительский каталог, например rm -rf directory .
После долгих споров о том, что это не имеет значения, мы решили протестировать его вместе с третьим методом использования find . Вот результаты:
Каталог rm -rf работает примерно в 9 РАЗ БЫСТРЕЕ, чем rm -rf * !
Излишне говорить, что мы купили этому инженеру пива!
Теперь мы используем каталог rm -rf; mkdir, чтобы удалить каталог и создать его заново.
Проблема в том, что * выполняет расширение оболочки, что означает: (а) чтение всего каталога, а затем (б) сортировка всех имен файлов еще до вызова поиска. Использование ls -1 -U читает каталог в последовательном порядке. Вы можете ввести -n 10000 и получить список для отправки в xargs rm. И поскольку все эти имена являются последовательными в первой части каталога, они также эффективно удаляются. Просто поместите это в цикл, пока не останется файлов, и это работает очень хорошо.
Есть несколько методов, которые можно использовать для удаления большого количества файлов в Linux. Вы можете использовать опцию поиска с удалением, которая быстрее, чем опция exec. Затем вы можете использовать perl unlink, а затем даже rsync. Как удалить большое количество файлов в Linux
О параметре -delete выше: я использую его для удаления большого количества (приблизительно 1 миллиона) файлов во временной папке, которую я создал и непреднамеренно забыл очищать каждую ночь. Я случайно заполнил свой диск/раздел, и ничто другое не могло их удалить, кроме find . команда. Это медленно, сначала я использовал:
Но на это ушло ЧРЕЗВЫЧАЙНО много времени. Примерно через 15 минут он начал удалять некоторые файлы, но я предполагаю, что после того, как он наконец начался, он удалял менее 10 или около того в секунду. Итак, я попробовал:
вместо этого, и я позволяю ему работать прямо сейчас. Кажется, что он работает быстрее, хотя он ЧРЕЗВЫЧАЙНО нагружает ЦП, чего не было с другой командой. Он работает уже около часа, и я думаю, что у меня снова появляется место на моем диске, и раздел постепенно «худеет», но это все еще занимает очень много времени. Я серьезно сомневаюсь, что он работает в 1000 раз быстрее, чем другой. Как и во всем, я просто хотел указать на компромисс между пространством и временем. Если у вас есть запас пропускной способности процессора (у нас есть), запустите последний. Мой процессор работает (отчеты о времени безотказной работы):
И я видел, что средняя нагрузка превышала 30,00, что не очень хорошо для загруженной системы, но для нашей, обычно слабо загруженной, это нормально в течение пары часов. Я проверил большинство других вещей в системе, и они по-прежнему реагируют, так что пока все в порядке.
Год назад я написал статью, в которой показал, как искать, выбирать и удалять несколько файлов с помощью Midnight Commander, или, как многие из нас его знают: MC.
В этой другой статье мы проделаем ту же процедуру (поэтому мы воспользуемся преимуществом и обновим ее), но я покажу вам, как фильтровать, выбирать и исключать результаты в соответствии с определенным критерием.
Давай попробуем. Открываем терминал и входим с МК в устройство USB, которое будет называться Flash Driver, и будет монтироваться на /half например:
У нас должно получиться что-то вроде этого:
а где написано Архив мы удаляем * и ставим название того что хотим удалить, например .thumbs, ненавистные файлы сгенерированные Windows.
Конечно, мы можем использовать звездочки для фильтрации поиска, например: * Thumbs o Thumbs *.
Для примеров изображений я использовал слово ubuntu. Следует отметить, что поиск в Ubuntu не будет таким же, как в Ubuntu. Результаты отображаются следующим образом:
Теперь отмечаем опцию: Take to panel
и, как вы можете видеть на изображении выше, все найденные файлы были размещены на левой панели. Теперь клавишей Insertion выделяем все. Затем нажимаем F8 уже сказанное удалить.
Пока то, что я показал в старой статье, но мы ее еще немного расширим, чтобы нам было легче ее стирать. Допустим, я искал все изображения, которые у меня есть, в папке, имеющей формат . JPG. Получаем что-то вроде этого:
Результат вернул кучу изображений, которые мне не нужны. Допустим, я хочу только выбрать «Удалить», «Переместить» или «Копировать» все изображения, в названии которых есть слово «Android».
Мы написали *Android* со звездочками:
И автоматически выбираются все файлы, соответствующие этому требованию:
Теперь мы можем удалить, переместить или скопировать их. Мы также можем сделать обратный выбор ( * ). И готово!
Содержание статьи соответствует нашим принципам редакционной этики. Чтобы сообщить об ошибке, нажмите здесь!.
Читайте также: