В Linux есть несколько способов рекурсивного (с заходом в подкаталоги) удаления файлов с нужным расширением (.xyz) в указанной директории и её поддиректориях. Если делать такую операцию вручную, то это может быть утомительно, занять много времени, а также чревато ошибками, особенно если структура каталогов сложная. В этой статье (перевод [1]) будут рассмотрены 3 метода рекурсивного удаления файлов с определенным расширением в среде Linux.
[Использование команды find]
Для удаления файлов с указанным расширением в директории и всех её подкаталогов мы можем использовать следующую команду:
$ find /path/to/dir -name "*.extension" -type f -delete
Здесь /path/to/dir это путь до директории, где вы хотите удалять файлы, *.extension это шаблон для удаления файлов, -type f задает что надо удалять только файлы, и -delete задает действие по удалению файлов.
Например, чтобы удалить все файлы .txt в директории /home/user/documents и её подкаталогах, команда будет выглядеть вот так:
$ find /home/user/documents -name "*.txt" -type f -delete
Будьте внимательны, поскольку команда удалит все файлы молча без предупреждения. Предварительно лучше убедиться, что при запуске команды удаляемый список будет тот, какой вы хотите. Такую проверку можно осуществить командой (здесь подразумевается, что вы перешли в ту папку, в которой собираетесь удалить файлы с расширением .txt):
$ find . -name "*.txt" -type f
Также важно иметь в виду, что опция -delete должна быть последним аргументом в команде. Если она будет помещена перед аргументом -name "*.txt", то будут удалены вообще все файлы. Таким образом, этот метод следует использовать осторожно, и не помешает сначала сделать копию важных данных.
[Команда find вместе с командой rm]
Команда rm в Linux это базовый инструмент для манипуляции файлами, предназначенная для удаления файлов и директорий. Как ни странно, напрямую эту команду нельзя использовать для удаления фалов с определенным расширением. Например, команда rm -r *.xyz не сработает.
Но rm может быть использована вместе с другими командами для достижения желаемого результата. Для удаления файлов с указанным расширением в директории и всех её подкаталогов мы можем использвать следующую команду:
$ find /path/to/dir -name "*.extension" -type f -exec rm -f {} \;
И опять, здесь /path/to/dir это путь до директории, где вы хотите удалять файлы, *.extension это шаблон для удаления файлов, -type f задает что надо удалять только файлы, и -exec используется для выполнения команды rm -f для удаления файлов без запроса подтверждения. {} это хранилище для имени обрабатываемого файла, и \; это конец команды, используемый для завершения выполнения команды.
Например, чтобы удалить все файлы .txt в директории /home/user/documents и её подкаталогах, команда будет выглядеть вот так:
$ find /home/user/documents -name "*.txt" -type f -exec rm -f {} \;
[Использование цикла]
Еще один способ рекурсивного удаления файлов с определенным расширением - цикл в комбинации с командами find и rm.
$ for file in $(find /path/to/dir -name "*.extension"); do rm -f "$file"; done
Здесь также /path/to/dir это путь до директории, где вы хотите удалять файлы, *.extension это шаблон для удаления файлов, и rm -f это команда для удаления файлов с опцией -f для принудительного удаления файлов без запроса подтверждения. Команда $(find...) используется для поиска файлов, и цикл здесь применен для итерации по результату поиска. К каждому элементу результата будет применена команда rm.
Например, чтобы удалить все файлы .txt в директории /home/user/documents и её подкаталогах, команда будет выглядеть вот так:
$ for file in $(find /home/user/documents -name "*.txt"); do rm -f "$file"; done
Следует учесть, что этот метод не настолько эффективен, как предыдущие 2 метода, поскольку требует дополнительной обработки для построения списка файлов и запуска команды rm для каждого файла. Однако такой вариант может быть полезен, когда другие методы не работают.
[Ссылки]
1. Recursively Deleting Files With a Specific Extension on Linux site:tutorialspoint.com. |