Как прочитать токены из входного файла, чтобы удалить упомянутые там файлы

systemd --user работает как системная служба с именем user@.service. Это шаблонный сервис. Ваш экземпляр может быть user@1000.service. Этот номер является вашим идентификатором пользователя (id -u).

Процедура выключения системы подаст сигнал user@1000.serviceоб остановке обычным сигналом SIGTERM. В ответ процесс systemd --userподаст сигнал об остановке каждой пользовательской службы. [ *]

systemctl cat user@.serviceпредполагает, что нет особого смысла устанавливать тайм-аут обслуживания пользователя (льготный период )дольше 120 секунд. После этого все пользовательские сервисы получат SIGKILLот основной системы (PID 1 ). SIGKILLнемедленно приводит к летальному исходу.

Чтобы понять настройки в этом файле, см. man systemd.kill, а также man systemd.service.


[*] Технически systemd --userв ответ на SIGTERMактивирует пользовательский блок exit.target. Об этом упоминается в man systemd. Дополнительную информацию оexit.target:systemctl cat exit.targetскажу вам посмотреть в man systemd.special:-).

-1
26.05.2021, 11:03
2 ответа

Предполагая, что ваш файл конфигурации не содержит полей со встроенными символами новой строки или запятыми, и предполагая, что вы хотите удалить все файлы с указанным префиксом имени файла только в указанных каталогах (, т.е. не рекурсивно):

#!/bin/sh

while IFS=, read -r directory prefix; do
    rm -- "$directory/$prefix"*
done <config.txt

Это считывает первое поле с разделителями-запятыми -в каждой строке в переменную directory, а остальную часть строки — в переменную prefix. Затем он использует их для удаления файлов. (См. Где задокументирован аргумент`--`(двойного тире )? для объяснения--)

Если вам нужно выполнить удаление рекурсивно, под каждым указанным путем к каталогу:

#!/bin/sh

while IFS=, read -r directory prefix; do
    find "$directory" -name "$prefix*" -exec rm {} +
done <config.txt

Разница между этими двумя, за исключением findрекурсивного поиска, заключается в том, что $prefixбудет использоваться, как если бы это был шаблон подстановки в команде find.

Обратите внимание, что *необходимо заключать в кавычки при использовании с find, чтобы оболочка не расширяла его до совпадения имен в текущем каталоге, и что *должен быть без кавычек , когда используется с rmв первом цикле выше, так что оболочка расширяет его до всех совпадающих имен.

Если вы не хотите выполнять удаление рекурсивно, но у вас так много файлов, соответствующих сгенерированным шаблонам, что первый цикл выдает ошибку «слишком длинный список аргументов», вы можете хотите сделать дополнительный внутренний цикл,

#!/bin/sh

while IFS=, read -r directory prefix; do
    for pathname in "$directory/$prefix"*; do
        rm -- "$pathname"
    done
done <config.txt

или используйте findс ограничением пути поиска верхнего -уровня,

#!/bin/sh

while IFS=, read -r directory prefix; do
    find "$directory" ! -path "$directory" -prune -name "$prefix*" -exec rm {} +
done <config.txt
3
28.07.2021, 11:29

Мы используем xargs для передачи путей к файлам из файла config.txt в исполняемый файл sh в его командной строке.

< config.txt xargs -rd'\n' sh -c '
for arg do
 find "${arg%,*}" \
    -name "${arg##*,}*" \
    -type f \
    -exec rm -f {} + ;
done
' xargs-sh
2
28.07.2021, 11:29

Теги

Похожие вопросы