Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Удаление файлов и директорий по ключевому слову.  (Прочитано 1368 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн seralekseenko

  • Автор темы
  • Любитель
  • *
  • Сообщений: 53
    • Просмотр профиля
Здравствуйте.

Поскольку я считаю сбя новичком — пишу в этой ветке. Хочу разобраться в способах массового удаления файлов и папок.

Суть вопроса: какие есть способы удалить все файлы и директории по ключевому слову?

Например, для следующей структуры папок и файлов:

-/desktop
        -/first
               MyText.txt
               MyTestic.txt
               sound.mp3
              -/inFirst
                       someFile.testic
        -/second
               -/testic
                       testic.testic
                       other.txt
                      -/deepFolder
                                  someFile.pdf
               -/Testic
                       Testic.testic
я хочу удалить все, что содержит слово "testic". Не зависимо от того, что это: расширение файла, часть имени файла, часть имени директории. Регистр символов пока не трогаем.

Ожидаемый результат:

-/desktop
        -/first
               MyText.txt
               MyTestic.txt
               sound.mp3
              -/inFirst
        -/second
               -/Testic

Я нащупал два способа выполнения этой задачи:
  • Самым простым способом удалить всё, что содержит сочетание букв "testic" оказалась команда "rm":
    rm -rfv desktop/**/*testic*. (Для работы двойных звездочек (**) в bash  нужно ввести shopt -s globstar)
    Это пока единственная команда, которая сработала в соответствии с моими ожиданиями.
  • Еще есть команда "find" с опцией "-delite". Но она удаляет либо только файлы: find desktop/ -name "testic" -type f -delete, либо только папки: find desktop/ -name "testic" -type d -delete. Объединение команды в "-type f,d" выдает ошибку "directory is not empty". Если применять их по очереди — вроде все получается.

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

Какие еще есть команды массового удаления файлов и папок по заданным параметрам?
« Последнее редактирование: 05 Сентября 2020, 16:19:53 от seralekseenko »

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6755
  • 20% Cooler
    • Просмотр профиля
find desktop -name "*testic*" -exec rm -r {} \;
Пользователь добавил сообщение 05 Сентября 2020, 18:07:44:
Про удаление по ключевому слову в любом регистре
find -iname ...
« Последнее редактирование: 05 Сентября 2020, 18:07:44 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн seralekseenko

  • Автор темы
  • Любитель
  • *
  • Сообщений: 53
    • Просмотр профиля
ALiEN175, спасибо за ответ.

Если не сложно, не могли бы Вы детально описать выражение "{} \;"? И почему должна быть точка с запятой в конце?

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6755
  • 20% Cooler
    • Просмотр профиля
{} - подстановка того, что нашел find
\; - завершение конструкции exec. Можно использовать + (тогда exec выполнится единожды со всем найденным как аргументы для команды)

man find
« Последнее редактирование: 05 Сентября 2020, 21:21:42 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн user@localhost

  • Новичок
  • *
  • Сообщений: 3
    • Просмотр профиля
find desktop -name "*testic*" -exec rm -r {} \;

У find есть спец. ключ для удаления -
find /path/to/where -iname '*glob-pattern*' -delete

Оффлайн ALiEN

  • Администратор
  • Старожил
  • *
  • Сообщений: 6755
  • 20% Cooler
    • Просмотр профиля
user@localhost, есть конечно. Только вот не удаляет непустые директории.  :coolsmiley:

Пользователь добавил сообщение 09 Сентября 2020, 21:33:44:
Код: (txt) [Выделить]
$: mkdir 12345
$: touch 12345/file
$: find -iname 12345 -delete
find: не удалось удалить ‘./12345’: Каталог не пуст
$: rm 12345/file
$: find -iname 12345 -delete
$:
« Последнее редактирование: 09 Сентября 2020, 21:36:41 от ALiEN175 »
🖥 AsRock B550M Pro4 :: AMD Ryzen 5 3600 :: 16 GB DDR4 :: AMD Radeon RX 6600 :: XFCE
💻 ACER 5750G :: Intel Core i5-2450M :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн Azure

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
ALiEN175, потому и надо сначала файлы удалитьfind -iregex '.*/12345\(\|/.*\)' -delete
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.074 секунд. Запросов: 25.