Удалить массовые файлы

Мне нужно удалить все файлы * .html. Но у меня есть родительская папка, в которой так много дочерних папок, и файл HTML присутствует в каждой дочерней папке. Я могу удалить файлы, посетив папку каждого ребенка. Но мне нужно удалить каждый HTML-файл прямо из родительской папки

3
задан 12 December 2020 в 15:47

2 ответа

Самый простой способ:

find . -type f -name '*.html' -delete   

Сделайте это из каталога, из которого вы хотите запустить его.

  • find - это команда для поиска чего-либо
  • . означает из каталога, в котором вы сейчас находитесь
  • f означает поиск только файлов ( d для каталогов)
  • и поиск имя , заканчивающийся на .html
  • и find имеет параметр delete s them
11
ответ дан 3 January 2021 в 22:46

Прежде чем дать вам готовое решение для вставки и запуска, я хотел бы объяснить некоторые передовые практики и шаблоны автоматизации для оболочки Linux. Те же концепции применяются и в других областях ИТ:

  • разделяй и властвуй : разбиение проблемы на (изолированные) части для легкого решения
  • разделение задач : здесь удалить как команду; поиск как запрос (CQRS)
  • каналы и фильтры : комбинация лучших инструментов в цепочке

Предварительный просмотр и конвейер объяснены

Хотя следующий рецепт не работает для подкаталогов (рекурсивный), он иллюстрирует безопасный и модульный метод объединения команд.

a) простой список и удаление (предварительный просмотр перед действием):

  1. список всех файлов HTML (просто список,не ревурсивно) ls * .html

  2. затем удалите rm * .html

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

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

b) непосредственно в сочетании с xargs

ls *.html | xargs -r0 rm

xargs необходимо, потому что rm не может читать из stdin . Видеть: http://stackoverflow.com/questions/20307299/ddg#20307392

Параметр -r0 объединяет два параметра: -0 будет иметь дело с именами файлов в угловом регистре (с символами новой строки , пробелы или кавычки, например it done.html в них), которые более надежно разделены символом NUL . -r прекратит работу, если не будет введено никаких данных.

См .: Как я могу рекурсивно удалить все файлы с определенным расширением в текущем каталоге?

и: https://unix.stackexchange.com/a/83712

Прямое удаление с помощью glob

В некоторых оболочках (bash начиная с версии 4, ksh, zsh) вы можете рекурсивно удалять файлы с помощью подстановочных знаков ( globstar ) в пути.

См .: https://unix.stackexchange.com/questions/23576/how-do-i-recursively-delete-directories-with-wildcard

и как проверить / включить globstar

напрямую удалить (опасно):

rm **/*.html

Эти команды прямого удаления опасны, потому что небольшая опечатка будет иметь неблагоприятные последствия. Например, если случайно вставить пробел в rm * .html , он станет rm * .html . К сожалению, при этом будут удалены все файлы и может быть выведена ошибка не нахождения второго пути '.html'.

Объединить: найти и удалить

find (поиск файлов в иерархии каталогов) и удалить

  1. с помощью конвейера ( Совместимость с POSIX: работает в других системах)

    find. -тип f -name "* .html" | xargs -r0 rm

  2. , непосредственно выполняя следующую команду (например, trash-cli, для последующего восстановления после удаления):

    find. -type f -name "* .html" -exec trash {}

  3. напрямую с помощью удобных действий (надежно: избегать появления и условий гонки)

    find. -type f -name "* .html" -print0 -delete

Объяснение:

  • -type f ищет только обычные файлы (не каталог d , не символические ссылки)
  • -name фильтрует имена, подобные заданному шаблону (также может быть расширено с помощью -или или -regex )
  • -print0 печатает найденный файл- пути (строго разделенные NUL) перед
  • -exec trash {} выполняет заданную команду (здесь trash ) с найденным файлом в качестве аргумента (заменяет фигурные скобки)
  • -delete удаляет найденный файл напрямую (поскольку выполняется в том же процессе, хотя и не так совместим со всеми версиями поиска)

См. важные предупреждения: Как я могу рекурсивно удалить все файлы с определенным расширением в текущем каталоге?

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

Предупреждение о массовом удалении: Linux не имеет встроенной функции восстановления

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

  • интерактивный вместо принудительного варианта: для rm -i вместо -f
  • сначала перечислить или найти, затем проверить, затем удалить (например, добавление каналов или первый запуск find без действий)
  • с использованием инструментов для удаления папки, которые поддерживают последующую отмену: например, trash-cli или gvfs-trash
1
ответ дан 3 January 2021 в 22:46

Другие вопросы по тегам:

Похожие вопросы: