Мне нужно удалить все файлы * .html. Но у меня есть родительская папка, в которой так много дочерних папок, и файл HTML присутствует в каждой дочерней папке. Я могу удалить файлы, посетив папку каждого ребенка. Но мне нужно удалить каждый HTML-файл прямо из родительской папки
Самый простой способ:
find . -type f -name '*.html' -delete
Сделайте это из каталога, из которого вы хотите запустить его.
find
- это команда для поиска чего-либо .
означает из каталога, в котором вы сейчас находитесь f
означает поиск только файлов ( d
для каталогов) имя
, заканчивающийся на .html
delete
s them Прежде чем дать вам готовое решение для вставки и запуска, я хотел бы объяснить некоторые передовые практики и шаблоны автоматизации для оболочки Linux. Те же концепции применяются и в других областях ИТ:
Хотя следующий рецепт не работает для подкаталогов (рекурсивный), он иллюстрирует безопасный и модульный метод объединения команд.
a) простой список и удаление (предварительный просмотр перед действием):
список всех файлов HTML (просто список,не ревурсивно)
ls * .html
затем удалите
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
В некоторых оболочках (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 (поиск файлов в иерархии каталогов) и удалить
с помощью конвейера ( Совместимость с POSIX: работает в других системах)
find. -тип f -name "* .html" | xargs -r0 rm
, непосредственно выполняя следующую команду (например, trash-cli, для последующего восстановления после удаления):
find. -type f -name "* .html" -exec trash {}
напрямую с помощью удобных действий (надежно: избегать появления и условий гонки)
find. -type f -name "* .html" -print0 -delete
Объяснение:
-type f
ищет только обычные файлы (не каталог d
, не символические ссылки) -name
фильтрует имена, подобные заданному шаблону (также может быть расширено с помощью -или
или -regex
) -print0
печатает найденный файл- пути (строго разделенные NUL) перед -exec trash {}
выполняет заданную команду (здесь trash ) с найденным файлом в качестве аргумента (заменяет фигурные скобки) -delete
удаляет найденный файл напрямую (поскольку выполняется в том же процессе, хотя и не так совместим со всеми версиями поиска) См. важные предупреждения: Как я могу рекурсивно удалить все файлы с определенным расширением в текущем каталоге?
Подробнее см. В руководстве GNU для Поиск, удаление файлов
, поэтому сначала проверьте, что найдено, перед удалением в пакетном режиме . Поэтому я рекомендую меры безопасности.
-i
вместо -f