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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: скрипт, очищающий при выключении /home/usr директорию  (Прочитано 2865 раз)

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

Оффлайн usefree

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
где то видел на форуме никак не могу найти скрипт, очищающий при выключении компьютера /home/usr директорию, но оставляющий список определенных файлов и каталогов.

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
find DIR | grep -v 'FILE1\|FILE2\|FILE3' | xargs -i rm -Rf '{}' \;Типа такого?

Оффлайн sciko

  • Активист
  • *
  • Сообщений: 854
    • Просмотр профиля
Лучше уж так
find DIR | grep -vf .pattern| xargs -i rm -Rf '{}' \;Соответственно в .pattern список сохраняемых файлов через '\|'. Естественно имена должны быть экранированы.

Оффлайн usefree

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
Лучше уж так
find DIR | grep -vf .pattern| xargs -i rm -Rf '{}' \;Соответственно в .pattern список сохраняемых файлов через '\|'. Естественно имена должны быть экранированы.
спасибо, я так понял скрипт

find dir - найти нужную директорию

grep -vf .pattern или grep -v 'FILE1\|FILE2\|FILE3' - это вроде как список, которых удалять не нужно в этой директории?? Если FILE1\|FILE2\|FILE3 - это просто перечисление, то .pattern вроде как шаблон?? а как его задавать, или где почитать?

xargs -i rm -Rf '{}' - это значит удалить все кроме перед идущего списка?

Оффлайн sciko

  • Активист
  • *
  • Сообщений: 854
    • Просмотр профиля
спасибо, я так понял скрипт
Нет. Вот пример скрипта:
#!/bin/sh
FILES=`cat $1`
find test  ! -regex "$FILES" -type f -delete
find test -type d -empty -delete
А это так просто подсказка куда рыть.


grep -vf .pattern или grep -v 'FILE1\|FILE2\|FILE3' - это вроде как список, которых удалять не нужно в этой директории?? Если FILE1\|FILE2\|FILE3 - это просто перечисление, то .pattern вроде как шаблон?? а как его задавать, или где почитать?
В обоих случаях это регэксп. Просто я предлагал читать его из скрытого файла .pattern, т.к. он может быть довольно длинным.

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Лучше уж так
find DIR | grep -vf .pattern| xargs -i rm -Rf '{}' \;Соответственно в .pattern список сохраняемых файлов через '\|'. Естественно имена должны быть экранированы.
спасибо, я так понял скрипт
Надо почитать маны.
man find
man grep
man xargs
И еще по регулярным выражениям что-нибудь (regular expressions, regexps).

find dir - найти нужную директорию
Найти все файлы в указанной директории
grep получит их список.

grep -vf .pattern или grep -v 'FILE1\|FILE2\|FILE3' - это вроде как список, которых удалять не нужно в этой директории?? Если FILE1\|FILE2\|FILE3 - это просто перечисление, то .pattern вроде как шаблон?? а как его задавать, или где почитать?
Поискать по заданному тексту (как мы помним, это список файлов) и найти все строки, в которых НЕ встречается заданное регулярное выражение.
Эти строки получит на вход xargs

xargs -i rm -Rf '{}' - это значит удалить все кроме перед идущего списка?
Для каждой строки в заданном тексте (как мы помним, это прореженный список файлов) выполнить заданные в аргументах команды, подставляя в них строку вместо '{}'.
Команда там одна: rm -Rf

Запуская каждую команду по отдельности, можно понять, что происходит.
В целях отладки, для безопасности и наглядности "rm -Rf" можно заменить на "echo rm -Rf". Тогда вместо тихого удаления файлов будет выведена на печать эта строчка с подставленным именем файла.
« Последнее редактирование: 18 Июня 2010, 13:06:09 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн sciko

  • Активист
  • *
  • Сообщений: 854
    • Просмотр профиля
И еще по регулярным выражениям что-нибудь (regular expressions, regexps).
man regex
Внезапно, не правда ли?

Поискать по заданному тексту (как мы помним, это список файлов
и директорий)
Т.к. Ключик -type f не стоит.

Для каждой строки в заданном тексте (как мы помним, это прореженный список файлов) выполнить заданные в аргументах команды, подставляя в них строку вместо '{}'.
Кстати, там будут проблемы с пробелами, т.к. они не экранируются.
И как я уже писал раньше, там будут ещё и директории. Поэтому фактически эта команда удалит все директории ниже 2 уровня вложенности.

В целях отладки, для безопасности и наглядности "rm -Rf" можно заменить на "echo rm -Rf"
В целях безопасности все действия надо проводить в отдельном акке без всяких прив в sudo в отдельной директории. Хотя бы потому, что удалённое rm восстановить нельзя.

Оффлайн [DarkNet]Alpha

  • Активист
  • *
  • Сообщений: 987
  • Эмоциональный эльдар
    • Просмотр профиля
    • EBM-радио
Ололо!
А как сделать, чтобы скрипт выполнялся при выключении машины?

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
вписать его выполнение юзеру в ~/.bash_logout или в скрипт в /etc/rcS.d (там в README более подробные сведения)
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн sciko

  • Активист
  • *
  • Сообщений: 854
    • Просмотр профиля
Если прописать в .bash_logout, то отрабатывать будет при при выходе пользователя.
А в /etc/rcS.d надо не забыть прописать чтобы отрабатывал только с опцией stop.

Оффлайн usefree

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
спасибо всем. Пробую, о результатах отпишусь как получитсяне получится

Пользователь решил продолжить мысль 22 Июня 2010, 13:13:18:
вписать его выполнение юзеру в ~/.bash_logout или в скрипт в /etc/rcS.d (там в README более подробные сведения)

вот что в ридми написано

The scripts in this directory whose names begin with an 'S' are executed once when booting the system, even when booting directly into single user mode
т.е. скрипты запускаются при загрузке системы
так куда же его все таки ложить, чтоб выполнялся при выключении??

1. Создал папку /home/alex/Документы
2. В ней создал каталог "odt", каталог "123"
3. запустил в консоли
find /home/alex/Документы | grep -v 'odt' | xargs -i rm -fR '{}' \;

в результате весь каталог /home/alex/Документы/ удален.

если убрать аргумент grep "-v"  то команда
find /home/alex/Документы | grep  '/home/alex/Документы/odt.odt' | xargs -i rm -fR '{}' \
ничего не удаляет.

все работает до команды xargs - проверял так:
запустил
find /home/alex/Документы | grep -v '/home/alex/Документы/odt' | xargs -i rm -f '{}'
т.е. rm без параметра -R
выдает

rm: невозможно удалить «/home/alex/Документы»: Это каталог
rm: невозможно удалить «/home/alex/Документы/123»: Это каталог
про каталог "odt" не  говорит ничего, т.е. удалять не собирается.

Помогите пожалуйста, как удалять не весь каталог а именно его содержимое, не подпадающее под список неудаляемого.
« Последнее редактирование: 22 Июня 2010, 17:12:10 от galaxer »

Оффлайн sciko

  • Активист
  • *
  • Сообщений: 854
    • Просмотр профиля
Если так не хочется читать посты, то погугли как загружается Линукс. Там же написано и как он выключается.

Оффлайн RustemNur

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 2939
  • умрешь с вами
    • Просмотр профиля
Ололо!
А как сделать, чтобы скрипт выполнялся при выключении машины?

Я так делаю (скрипт лежит в /etc/init.d/):

update-rc.d my_great_script_on_poweroff start 11 0 .где - "11" - нужный/незанятый номер из очереди скриптов в /etc/rc0.d/

Оффлайн usefree

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
Если так не хочется читать посты, то погугли как загружается Линукс. Там же написано и как он выключается.

простите, если что, прочитал я ваши посты, почитал маны советуемые, нашел в гугле куда нужно ложить скрипт. Только он по прежнему удаляет весь каталог... хоть и находит в нем то, что удалять не нужно

Оффлайн sciko

  • Активист
  • *
  • Сообщений: 854
    • Просмотр профиля
Ололо!
А как сделать, чтобы скрипт выполнялся при выключении машины?

Я так делаю (скрипт лежит в /etc/init.d/):

update-rc.d my_great_script_on_poweroff start 11 0 .где - "11" - нужный/незанятый номер из очереди скриптов в /etc/rc0.d/
И это почти правильно. Только он может отрабатывать ещё и при загрузке, т.к. ты не сказал, что обрабатываешь опции.

простите, если что, прочитал я ваши посты, почитал маны советуемые, нашел в гугле куда нужно ложить скрипт. Только он по прежнему удаляет весь каталог... хоть и находит в нем то, что удалять не нужно
Значит недостаточно внимательно. Скрипт который точно работает, я давал. А в следующем посте я объяснял почему удаляются весь каталоги ниже второго уровня вложенности.

ЗЫ. ТС ещё не пытался работать с файлами и директориями в именах которых есть пробелы. Вот тогда-то мы и поймём умеет ли читать ТС или нет.

 

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