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


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

Автор Тема: Помогите с написанием скрипта на Bash.  (Прочитано 1133 раз)

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

Оффлайн Garstag

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Помогите с написанием скрипта на Bash.
« : 24 Сентябрь 2015, 09:56:56 »
Уважаемые специалисты, помогите, пожалуйста, с написанием скрипта.
Скрипт должен уметь зачищать все файлы в иерархической структуре каталогов, но по списку исключений пропускать некоторые папки.
Команда rm не умеет читать список исключений, к сожалению.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6009
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Помогите с написанием скрипта на Bash.
« Ответ #1 : 24 Сентябрь 2015, 10:45:33 »
Список исключений прекрасно "читает" find (ну или что-то из разряда grep, если список большой). Да и сам bash c патернами прекрасно справляется. Внятно ставьте задачу: пример исходных данных, принцип обработки (пример списка исключений), результат.
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Garstag

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Помогите с написанием скрипта на Bash.
« Ответ #2 : 24 Сентябрь 2015, 11:08:32 »
Есть папка, содержащая структуру каталогов, нужно зачищать все файлы в этой иерархии, за исключением некоторых папок. Эти исключения, наверное, должны храниться в каком-либо файле, который наполняется администратором. При зачистке всех файлов скрипт должен читать файл исключений и обходить эти папки при зачистке.
Как-то так.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6009
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Помогите с написанием скрипта на Bash.
« Ответ #3 : 24 Сентябрь 2015, 12:45:53 »
Имена папок в файле exception.list должны заканчиваться на «/»
Код: Bash
  1. find dir/with/tree -type f | grep -vFf exception.list | xargs echo rm
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Garstag

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Помогите с написанием скрипта на Bash.
« Ответ #4 : 24 Сентябрь 2015, 14:19:19 »
Это просто замечательно! Но в результате получается, что сформированная команда на удаление файлов просто выводится на экран. А как её выполнить?
Список файлов собирается изумительно, исключения отрабатывают как надо, формирование команды на удаление происходит, но самого удаления нет.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6009
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Помогите с написанием скрипта на Bash.
« Ответ #5 : 24 Сентябрь 2015, 14:33:21 »
Так уберите echo (я его специально для тестирования вставил)…| xargs rm
« Последнее редактирование: 24 Сентябрь 2015, 14:35:46 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Garstag

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Помогите с написанием скрипта на Bash.
« Ответ #6 : 24 Сентябрь 2015, 14:44:23 »
В этом случае получаю ошибку - "rm: неверный ключ — «2»"

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6009
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Помогите с написанием скрипта на Bash.
« Ответ #7 : 24 Сентябрь 2015, 14:57:57 »
Имена файлов/папок с пробелами?
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Garstag

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Помогите с написанием скрипта на Bash.
« Ответ #8 : 24 Сентябрь 2015, 15:03:14 »
Ага, есть и такие.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6009
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Помогите с написанием скрипта на Bash.
« Ответ #9 : 24 Сентябрь 2015, 15:11:16 »
Код: Bash
  1. find dir/with/structure -type f -print0 | grep -aZzvFf  exception.list | xargs -0 echo rm
Ну или если есть возможность|желание потестить
Код: Bash
  1. find dir/with/structure -type f \! -exec bash -c "echo '{}' | grep -qFf exception.list " \; -print
Если будет выводить правильно -print заменить на -delete
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Garstag

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Помогите с написанием скрипта на Bash.
« Ответ #10 : 24 Сентябрь 2015, 15:27:03 »
Это просто фантастика!
Теперь осталось разобрать код и понять, как же это всё взлетает.
;-)

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6009
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Помогите с написанием скрипта на Bash.
« Ответ #11 : 24 Сентябрь 2015, 15:34:54 »
;)
Код: Bash
  1. man find
  2. man grep
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн Garstag

  • Автор темы
  • Новичок
  • *
  • Сообщений: 7
    • Просмотр профиля
Re: Помогите с написанием скрипта на Bash.
« Ответ #12 : 24 Сентябрь 2015, 15:38:02 »
Дык, распечатал и зачитываю до дыр.
;-)

Оффлайн alsoijw

  • Старожил
  • *
  • Сообщений: 4073
  • Fedora 25 GNOME 3 amd64
    • Просмотр профиля
Re: Помогите с написанием скрипта на Bash.
« Ответ #13 : 24 Сентябрь 2015, 18:56:29 »
Вот мой скрипт. для моих задач. Для себя измени. Имхо проще.
Код: Bash
  1. #!/bin/bash
  2. rm -f `find | sed '/main.cpp/d;/clear/d;/convert/d'`
Есть вопросы, говорите.
В одинарных кавычках после седа идёт список того что не удаляется.
« Последнее редактирование: 24 Сентябрь 2015, 20:00:13 от alsoijw »
Мало видеть нам начало - надо видеть и конец. Если видишь ты создание - значит где-то есть ТВОРЕЦ
Многие жалуются: геометрия в жизни не пригодилась. Ямб от хорея им приходится отличать ежедневно?

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6009
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: Помогите с написанием скрипта на Bash.
« Ответ #14 : 24 Сентябрь 2015, 19:40:37 »
alsoijw,
  • удаляет всё, в том числе и директории, которые ТС желает сохранить
  • работает только с 1 уровнем вложенности, т.е. dir1/dir2/file уже не затронет
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

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