использование find в bash для работы с filles на основе их шаблонов расширения

использование find в bash для работы с filles на основе их шаблонов расширения

Я использую команду «find», чтобы удалить некоторые бесполезные файлы указанных расширений из всех подпапок, расположенных в каталоге, из которого я выполняю команду.

find -type f -name *.txt -delete
find -type f -name *.xml -delete
find -type f -name *.pdbqt -delete
find -type f -name *.txt -delete

можно ли объединить эти 4 команды в одну, чтобы удалить 4 типа filles с помощью 1 команды? Можно ли альтернативно использовать find, чтобы удалить ВСЕ filles, которые НЕ принадлежат расширениям *.dlg?

решение1

Не цитировать *.txt— плохо. Смотретьfindутилита не выводит все файлы при использовании подстановочных знаков.

можно ли объединить эти 4 команды в одну?

Да. Смотрите.Объединение нескольких findкоманд в одну.

find . \( -name '*.txt' -o -name '*.xml' -o -name '*.pdbqt' \) …

(Здесь используются 3 шаблона, поскольку ваша 4-я команда дублирует 1-ю, и нет смысла использовать один и тот же шаблон дважды.)

Можно ли использовать альтернативный вариант findдля удаления ВСЕХ файлов, которые НЕ принадлежат расширениям *.dlg?

Да (и я предполагаю, что вам нужны обычные файлы, а не всефайлы):

find . -type f ! -name '*.dlg'        # -delete

Если приведенная выше команда выводит файлы, которые вы действительно хотите удалить, запустите ее с #параметром removed.

Тест ! -name '*.dlg'отрицается -name '*.dlg'. Он успешен тогда и только тогда, когда -name '*.dlg'он провалится.

Вы использовали -deleteв вопросе, так что ваш, findпо-видимому, поддерживает его. Пользователи с меньшими возможностями findвидятfind: -exec rm {} \;против -delete- почему первый вариант широко рекомендуется?

Обратите внимание, в вашем случае bare findработает как find .. Я использовал find .явно, потому что некоторые реализации findтребуют по крайней мере один путь в командной строке.

Связанный контент