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


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

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

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

Оффлайн usefree

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля

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

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

перечитал вдоль и поперек ман по grep ... не нашел ничего про ключ -type f
вы писали раньше что там будут еще и директории, ну так да! и как из этого следует что удалятся все каталоги ниже второго уровня???

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
надо было еще почитать man find.
Ключ -type f  - это к find, говорит искать только файлы, пропуская директории.

Цитировать
вы писали раньше что там будут еще и директории, ну так да! и как из этого следует что удалятся все каталоги ниже второго уровня???
команда эрэм эрэф /home/user/dir/ удалит директорию со всем, что в ней.
« Последнее редактирование: 22 Июня 2010, 19:15:48 от wl »
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн RustemNur

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 2939
  • умрешь с вами
    • Просмотр профиля
Цитировать
update-rc.d my_great_script_on_poweroff start 11 0 .
И это почти правильно. Только он может отрабатывать ещё и при загрузке, т.к. ты не сказал, что обрабатываешь опции.

Не мог бы ты растолковать, а то я не понял что-то. Насчет запуска при загрузке.
Спасибо.

Оффлайн sciko

  • Активист
  • *
  • Сообщений: 854
    • Просмотр профиля
Не мог бы ты растолковать, а то я не понял что-то. Насчет запуска при загрузке.
На самом деле всё очень просто. Объясню на примере
#!/bin/bash
# INIT script to check whether we're on batteries, and so start with laptop
# mode etc enabled.

# BUGS: unless we start *really* late, we have no way of throttling
# xscreensaver, since it won't be there to command.
. /usr/share/acpi-support/power-funcs

test -f /lib/lsb/init-functions || exit 1
. /lib/lsb/init-functions

test -d /var/lib/acpi-support || exit 0

shopt -s nullglob

case "$1" in
  start)
    log_begin_msg "Checking battery state..."
    /etc/acpi/power.sh
    log_end_msg 0
    ;;
  stop)
    log_begin_msg "Disabling power management..."
    /etc/acpi/power.sh false
    log_end_msg 0
    ;;
  *)
  ;;
esac
Это скрипт, который запускает и останавливает управление питанием acpi. При загрузке этот скрипт должен включить управление питанием, а при отключении -- выключить. Включение достигается вызовом скрипта /etc/acpi/power.sh без всяких опций, а выключение -- с опцией false.
Чтобы различать когда происходит включение, а когда отключение приведённый выше скрипт запускается системой с разными опциями: start -- при включении и stop -- при выключении.
Также его можно отключить или включить и вручную. Если принять, что приведённый выше скрипт называется acpi-support, то для отключения мы можем подать команду acpi-support stopИзвиняюсь, что малость сумбурно получилось.

Пользователь решил продолжить мысль 22 Июня 2010, 23:16:36:
ТС уже подошёл очень близко к работающему скрипту. Ждём когда он последними усилиями воли всё-таки подключит мозг и обнаружит его.
« Последнее редактирование: 22 Июня 2010, 23:16:36 от sciko »

Оффлайн RustemNur

  • Почётный модератор
  • Старожил
  • *
  • Сообщений: 2939
  • умрешь с вами
    • Просмотр профиля
Извиняюсь перед ТС за то, что залез в его топик, но мне хотелось бы получить ясность насчет уровней выполнения.
(Нажмите, чтобы показать/скрыть)

Оффлайн usefree

  • Автор темы
  • Любитель
  • *
  • Сообщений: 94
    • Просмотр профиля
надо было еще почитать man find.
Ключ -type f  - это к find, говорит искать только файлы, пропуская директории.

Цитировать
вы писали раньше что там будут еще и директории, ну так да! и как из этого следует что удалятся все каталоги ниже второго уровня???
команда эрэм эрэф /home/user/dir/ удалит директорию со всем, что в ней.

да, если с ключом -type f к find то находятся только файлы? мне нужно чтоб находились и вложенные директории, поэтому без этого ключа. Но при передаче параметров в grep, нужно чтоб не передавалась корневая директория.

examples man find говорит
"find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
       Find files named core IN or BELLOW the directory /tmp and  delete  them"
почему моя команда
"find /home/alex/Документы" находит и IN и BELLOW и саму эту директорию, понятно, что найдя удалит.
Ладно, пусть находит и передает в grep, но там grep  -v '/home/alex/Документы/', что означает если есть совпадение в имени, то не передавать его дальше в команду  xargs (а совпадение есть - это же первый найденный find объект- корневая директория).
Как мне не передавать корневую директорию в xargs?
 

Оффлайн wl

  • Старожил
  • *
  • Сообщений: 1393
    • Просмотр профиля
Но при передаче параметров в grep, нужно чтоб не передавалась корневая директория.

examples man find говорит
"find /tmp -name core -type f -print0 | xargs -0 /bin/rm -f
       Find files named core IN or BELOW the directory /tmp and  delete  them"
почему моя команда
"find /home/alex/Документы" находит и IN и BELOW и саму эту директорию, понятно, что найдя удалит.

Видимо, что-то неправильно в регэкспе.

$ find /tmp -name "*qutim*" -print
/tmp/qutim_temp.gl2452
/tmp/qtsingleapp-qutim-ba33-3e8-lockfile
/tmp/qutim_temp.Dq2452
/tmp/qutim_temp.SE2452
/tmp/qutim_temp.aH2452
/tmp/qtsingleapp-qutim-ba33-3e8
/tmp/1/qutim1
/tmp/1/qutim1/qutim2
/tmp/qutim_temp.QV2452

/tmp не выводится и не передается никуда.

Если нужна какая-то сложная логика, можно результат find отдавать не в конвейер grep  | xargs,  а в awk-овый скрипт, например.
Или вообще написать все на перле: http://perldoc.perl.org/File/Find.html

А вообще, что требуется-то?

Может, проще сделать так (см. ниже)?
Создать чистую юзерскую директорию, закатать ее в архив tar.gz - сделать, так сказать, шаблон.
При уходе юзера удалять вообще все, что он наваял, командой rm -rf, разворачивать чистый шаблон, и менять владельца файлов на этого юзера (chown).
На свете феньки есть такие, брат Горацио, которых лохи просто не секут. (Шекспир, "Гамлет", вольный перевод)

Оффлайн ArcFi

  • Старожил
  • *
  • Сообщений: 15189
    • Просмотр профиля
    • aetera.net
да, если с ключом -type f к find то находятся только файлы? мне нужно чтоб находились и вложенные директории
Можно запустить второй раз на удаление пустых директорий: "-type d -empty".

Ещё вариант:
1) перенос только необходимого в другое место (к примеру, через rsync)
2) полная очистка каталога
3) перенос обратно
« Последнее редактирование: 23 Июня 2010, 19:40:20 от ArcFi »

Оффлайн sciko

  • Активист
  • *
  • Сообщений: 854
    • Просмотр профиля
да, если с ключом -type f к find то находятся только файлы? мне нужно чтоб находились и вложенные директории
Можно запустить второй раз на удаление пустых директорий: "-type d -empty".
Раз уже всё разжевали, то дам я и ссылку на пост в котором ещё 18 числа я предложил рабочий скрипт: ссылка.
Если кто ещё не понял, то он трёт в поддиректории temp той директории из которой его вызвали. А имя файла с регэкспом ему передают как опцию.

Ещё вариант:
1) перенос только необходимого в другое место (к примеру, через rsync)
2) полная очистка каталога
3) перенос обратно
А вот это уже изврат. Кроме того, он будет дольше работать, т.к. требуется время на копирование сперва во временный каталог, а потом обратно.

 

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