Рекурсивно удаляйте файлы с именем `log` в нескольких каталогах - PullRequest
0 голосов
/ 02 октября 2019

У меня есть структура папок, подобная приведенной ниже:

feat1
feat2
feat3

Теперь внутри каждой папки у нас есть другая папка с именем builds. В builds у нас есть нумерованные папки, такие как 1, 2 и т. Д. В каждой нумерованной папке есть файлы шаблона *.log, а затем определенный файл с именем log.

. Мне нужно выполнить команду на сервере Linux / Unix для рекурсивного удаления только файла с именем log, а не *.log для всех этих папок feat1, feat2 и feat3. Как это сделать?

Ответы [ 2 ]

3 голосов
/ 02 октября 2019

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

  • Удалите что-нибудь с именем log из feat*/builds/*/:

    rm feat*/builds/*/log
    
  • Рекурсивно найти и удалить что-нибудь с именем log в любом месте текущего каталога:

    find . -name log -delete
    
  • Рекурсивно найти и удалить что-нибудьс именем log, только под feat*:

    find feat* -name log -delete
    
  • Рекурсивно находить и удалять что-либо с именем log, только под feat*/builds/*/:

    find feat*/builds/*/ -name log -delete
    
  • Рекурсивно найти и удалить любой файл с именем log, только под feat*/builds/*/:

    find feat*/builds/*/ -name log -type f -delete
    
1 голос
/ 02 октября 2019

Вот быстрое и грязное решение, использующее цикл for, который должен выполнить работу.

for f in `find feat* -name 'log'`; do rm "$f"; done;

for f in говорит, что мы собираемся сделать цикл for с f в качествепеременная для каждого результата.

find feat* -name 'log' выполняет поиск в любом каталоге, начинающемся с "feat" с * в качестве подстановочного знака.

-name говорит, что мы ищем имя файла log.

do rm "$f" удаляет каждый найденный результат.

Иногда бывает полезно использовать echo перед выполнением деструктивных команд таким способом. См. Ниже.

for f in `find feat* -name 'log'`; do echo "$f"; done;
...