Измените lightdm.conf на:
[SeatDefaults]
user-session=ubuntu
greeter-session=unity-greeter
allow-guest=false
без пробелов.
Если вы хотите, чтобы сценарий по-прежнему работал в одном каталоге, без рекурсии через подкаталоги, подсчет и удаление можно выполнить в цикле while. Последний раздел функции main должен быть изменен, чтобы выглядеть так:
local file_inodes=$(get_files)
while filecount_above_limit
do
printf "@@@ File count in %s is above %d." "$directory" $max_files
printf "Will delete oldest\n"
sort -k1 -n <<< "$file_inodes" | delete_oldest
local file_inodes=$(get_files)
done
printf "@@@ File count in %s is below %d." "$directory" $max_files
printf "Exiting normally"
Внимание! Проблема с этим простым изменением заключается в том, что если вы не прокомментировали строку удаления наверху, скрипт будет работать бесконечно, поскольку он пересчитывает количество файлов после каждого удаления. Если файл не удаляется, количество файлов остается таким же, и цикл никогда не выходит.
Сценарий можно изменить более сложным способом, чтобы удалить индекс файла из file_inodes массив после удаления и отрицательно увеличивать переменную file_count, а не повторять строку local file_inodes=$(get_files). Это будет иметь дело с ситуацией, не связанной с удалением, но я оставлю это кому-то еще.
Если вы хотите, чтобы сценарий по-прежнему работал в одном каталоге, без рекурсии через подкаталоги, подсчет и удаление можно выполнить в цикле while. Последний раздел функции main должен быть изменен, чтобы выглядеть так:
local file_inodes=$(get_files)
while filecount_above_limit
do
printf "@@@ File count in %s is above %d." "$directory" $max_files
printf "Will delete oldest\n"
sort -k1 -n <<< "$file_inodes" | delete_oldest
local file_inodes=$(get_files)
done
printf "@@@ File count in %s is below %d." "$directory" $max_files
printf "Exiting normally"
Внимание! Проблема с этим простым изменением заключается в том, что если вы не прокомментировали строку удаления наверху, скрипт будет работать бесконечно, поскольку он пересчитывает количество файлов после каждого удаления. Если файл не удаляется, количество файлов остается таким же, и цикл никогда не выходит.
Сценарий можно изменить более сложным способом, чтобы удалить индекс файла из file_inodes массив после удаления и отрицательно увеличивать переменную file_count, а не повторять строку local file_inodes=$(get_files). Это будет иметь дело с ситуацией, не связанной с удалением, но я оставлю это кому-то еще.
Если вы хотите, чтобы сценарий по-прежнему работал в одном каталоге, без рекурсии через подкаталоги, подсчет и удаление можно выполнить в цикле while. Последний раздел функции main должен быть изменен, чтобы выглядеть так:
local file_inodes=$(get_files)
while filecount_above_limit
do
printf "@@@ File count in %s is above %d." "$directory" $max_files
printf "Will delete oldest\n"
sort -k1 -n <<< "$file_inodes" | delete_oldest
local file_inodes=$(get_files)
done
printf "@@@ File count in %s is below %d." "$directory" $max_files
printf "Exiting normally"
Внимание! Проблема с этим простым изменением заключается в том, что если вы не прокомментировали строку удаления наверху, скрипт будет работать бесконечно, поскольку он пересчитывает количество файлов после каждого удаления. Если файл не удаляется, количество файлов остается таким же, и цикл никогда не выходит.
Сценарий можно изменить более сложным способом, чтобы удалить индекс файла из file_inodes массив после удаления и отрицательно увеличивать переменную file_count, а не повторять строку local file_inodes=$(get_files). Это будет иметь дело с ситуацией, не связанной с удалением, но я оставлю это кому-то еще.
я бы предложил другое решение, что буду ходить рекурсивно в рамках целевой структуры дерева каталогов и удалить все файлы, но кроме предварительно определенное количество новых файлов. Это решение базируется на: (1) Рекурсивный баш скрипт и (2) объяснить Shell-скрипт рекурсивно распечатать полный каталог дерева.
1. Создать исполняемый файл, скрипт, называется [ф9] (ходьбы и удалить), которая находится в [F10] для того, чтобы быть доступным в качестве командной оболочки (Рекурсивный скрипт).
1. содержание сценарии на [F11] - это очень просто:
[Ф1]3. Объяснение:
в начале скрипт будет проверять, если переменная [ф12] (что определенное количество файлов, которые будут храниться) устанавливается заранее - условие [от f13]. Если это не задано значение по умолчанию [ф14]. Следующие сделки скрипт с указанием пути назначения (ввода команд). Если это не предусмотрено - состояние [ф15] - скрипт будет работать в текущем каталоге. Наконец основная функция [ф16] будет выполняться. в начале скрипт будет проверять, если переменная [ф12] (что определенное количество файлов, которые будут храниться) задается заранее - условие [от f13]. Если это не задано значение по умолчанию [ф14].в начале скрипт будет проверять, если переменная [ф12] (что определенное количество файлов, которые будут храниться) устанавливается заранее - условие [от f13]. Если это не задано значение по умолчанию [ф14].
изначально он будет установить локальное значение переменной внутреннего Баш [f25 привод датчика], таким образом мы можем правильно обращаться [ф26], ни есть пространства внутри отдельных имен файлов. Далее команда rm $(<the list of the files to be removed>) будет выполняться. Перенаправление ошибок [ф28] для этих случаев, когда нечего убрать. <the list of the files to be removed> берется таким образом: команда [f30 с] появится список содержимого текущего каталога в формате листинга [ф31] и список будет отсортирован по времени модификации, сначала новые [f32 из]. И этот список передается | к следующей команде. Следующая команда grep -Po '^-.*[0-9]{2}:[0-9]{2} \K.*' будет обрезать эти строки, которые начинаются [ф35] с [f36 в]†, от их начала до образца [фунции f37]‡. Параметр -P с параметром [ф39] будет выводить строки, соответствующие шаблону [ф40]. В [ф41] уведомление будет игнорировать подобранные детали перед собой. (источник - этот полезный ответ) †таким образом мы получим только имена файлов из списка. В выход ls -l линии, которые описывают каталоги, начать с d, и эти файлы начинаются с [пулемет f44]. (источник идеи) ‡этот шаблон совпадает с форматом времени [f45 с]. Наконец, команда tail -n +"$((NFK+1)) будут резать первых строках нашего списка файлов. Числа эти первые строки равен значению $NFK плюс 1, это требование команды tail.функция [ф24]:
в начале скрипт будет проверять, если переменная [ф12] (что определенное количество файлов, которые будут храниться) задается заранее - условие [от f13]. Если это не задано значение по умолчанию [ф14].
изначально он будет установить локальное значение переменной внутреннего Баш [f25 привод датчика], таким образом мы можем правильно обращаться [ф26], ни есть пространства внутри отдельных имен файлов. Далее команда rm $(<the list of the files to be removed>) будет выполняться. Перенаправление ошибок [ф28] для этих случаев, когда нечего убрать. <the list of the files to be removed> берется таким образом: команда [f30 с] появится список содержимого текущего каталога в формате листинга [ф31] и список будет отсортирован по времени модификации, сначала новые [f32 из]. И этот список передается | к следующей команде. Следующая команда grep -Po '^-.*[0-9]{2}:[0-9]{2} \K.*' будет обрезать эти строки, которые начинаются [ф35] с [f36 в]†, от их начала до образца [фунции f37]‡. Параметр -P с параметром [ф39] будет выводить строки, соответствующие шаблону [ф40]. В [ф41] уведомление будет игнорировать подобранные детали перед собой. (источник - этот полезный ответ) †таким образом мы получим только имена файлов из списка. В выход ls -l линии, которые описывают каталоги, начать с d, и эти файлы начинаются с [пулемет f44]. (источник идеи) ‡этот шаблон совпадает с форматом времени [f45 с]. Наконец, команда tail -n +"$((NFK+1)) будут резать первых строках нашего списка файлов. Числа эти первые строки равен значению $NFK плюс 1, это требование команды tail. следующие сделки скрипт с указанием пути назначения (ввода команд). Если это не предусмотрено - состояние [ф15] - скрипт будет работать в текущем каталоге.следующим сценарием занимается путь назначения (ввода команд). Если это не предусмотрено - состояние [ф15] - скрипт будет работать в текущем каталоге.
[Ф4] , наконец, главная функция [ф16] будет выполняться.3. примеры использования:
[d63, как]следующие сделки скрипт с указанием пути назначения (ввода команд). Если это не предусмотрено - состояние [ф15] - скрипт будет работать в текущем каталоге.
[Ф4][!d63, как теперь мы можем выполнить несколько тестов: [d64 с], чтобы выполните walkr для любой другой каталог:[!d64 с] [ф7] теперь мы можем выполнить несколько тестов:теперь мы можем выполнить несколько тестов:
[ф8], где точное содержание [f55, которая] и <quiet> не имеет никакого значения. Просто входных переменных $3 и $4 не должен быть пустым, чтобы быть перезаписаны поведение по умолчанию.я бы предложил другое решение, что буду ходить рекурсивно в рамках целевой структуры дерева каталогов и удалить все файлы, но кроме предварительно определенное количество новых файлов. Это решение базируется на: (1) Рекурсивный баш скрипт и (2) объяснить Shell-скрипт рекурсивно распечатать полный каталог дерева.
1. Создать исполняемый файл, скрипт, называется walkr (ходьбы и удалить), которая находится в [F10] для того, чтобы быть доступным в качестве командной оболочки (Рекурсивный скрипт).
1. содержание сценарии на [F11] - это очень просто:
#!/bin/bash
[[ -z "${NFK}" ]] && NFK='7' || NFK="$NFK"
[[ -z "${1}" ]] && ABS_PATH="${PWD}" || cd "${1}" && ABS_PATH="${PWD}"
file_operations() {
local IFS=$'\t\n' # Change the value of the Internal Field Separator locally
rm $(ls -lt | grep -Po '^-.*[0-9]{2}:[0-9]{2} \K.*' | tail -n +"$((NFK+1))") 2>/dev/null
}
walk() {
cd "$1" && file_operations # Change directory to the destination path and call the above function
for item in "$1"/*; do [[ -d "$item" ]] && walk "$item"; done # Make the recursion
}
walk "${ABS_PATH}"
3. Объяснение:
в начале скрипт будет проверять, если переменная $NFK (что определенное количество файлов, которые будут храниться) устанавливается заранее - условие [от f13]. Если это не задано значение по умолчанию 7. Следующие сделки скрипт с указанием пути назначения (ввода команд). Если это не предусмотрено - состояние [[ -z "${1}" ]] - скрипт будет работать в текущем каталоге. Наконец основная функция walk() будет выполняться. в начале скрипт будет проверять, если переменная $NFK (что определенное количество файлов, которые будут храниться) задается заранее - условие [от f13]. Если это не задано значение по умолчанию 7.в начале скрипт будет проверять, если переменная $NFK (что определенное количество файлов, которые будут храниться) устанавливается заранее - условие [от f13]. Если это не задано значение по умолчанию 7.
изначально он будет установить локальное значение переменной внутреннего Баш [f25 привод датчика], таким образом мы можем правильно обращаться <the list of the files to be removed>, ни есть пространства внутри отдельных имен файлов. Далее команда rm $(<the list of the files to be removed>) будет выполняться. Перенаправление ошибок 2>/dev/null для этих случаев, когда нечего убрать. <the list of the files to be removed> берется таким образом: команда [f30 с] появится список содержимого текущего каталога в формате листинга -l и список будет отсортирован по времени модификации, сначала новые [f32 из]. И этот список передается | к следующей команде. Следующая команда grep -Po '^-.*[0-9]{2}:[0-9]{2} \K.*' будет обрезать эти строки, которые начинаются ^ с [f36 в]†, от их начала до образца [fунции f37]‡. Параметр -P с параметром -o будет выводить строки, соответствующие шаблону ^-.*[0-9]{2}:[0-9]{2}_. В \K уведомление будет игнорировать подобранные детали перед собой. (источник - этот полезный ответ) †таким образом мы получим только имена файлов из списка. В выход ls -l линии, которые описывают каталоги, начать с d, и эти файлы начинаются с [пулемет f44]. (источник идеи) ‡этот шаблон совпадает с форматом времени [f45 с]. Наконец, команда tail -n +"$((NFK+1)) будут резать первых строках нашего списка файлов. Числа эти первые строки равен значению $NFK плюс 1, это требование команды tail.функция file_operations():
в начале скрипт будет проверять, если переменная $NFK (что определенное количество файлов, которые будут храниться) задается заранее - условие [от f13]. Если это не задано значение по умолчанию 7.
изначально он будет установить локальное значение переменной внутреннего Баш [f25 привод датчика], таким образом мы можем правильно обращаться <the list of the files to be removed>, ни есть пространства внутри отдельных имен файлов. Далее команда rm $(<the list of the files to be removed>) будет выполняться. Перенаправление ошибок 2>/dev/null для этих случаев, когда нечего убрать. <the list of the files to be removed> берется таким образом: команда [f30 с] появится список содержимого текущего каталога в формате листинга -l и список будет отсортирован по времени модификации, сначала новые [f32 из]. И этот список передается | к следующей команде. Следующая команда grep -Po '^-.*[0-9]{2}:[0-9]{2} \K.*' будет обрезать эти строки, которые начинаются ^ с [f36 в]†, от их начала до образца [fунции f37]‡. Параметр -P с параметром -o будет выводить строки, соответствующие шаблону ^-.*[0-9]{2}:[0-9]{2}_. В \K уведомление будет игнорировать подобранные детали перед собой. (источник - этот полезный ответ) †таким образом мы получим только имена файлов из списка. В выход ls -l линии, которые описывают каталоги, начать с d, и эти файлы начинаются с [пулемет f44]. (источник идеи) ‡этот шаблон совпадает с форматом времени [f45 с]. Наконец, команда tail -n +"$((NFK+1)) будут резать первых строках нашего списка файлов. Числа эти первые строки равен значению $NFK плюс 1, это требование команды tail. следующие сделки скрипт с указанием пути назначения (ввода команд). Если это не предусмотрено - состояние [[ -z "${1}" ]] - скрипт будет работать в текущем каталоге.следующим сценарием занимается путь назначения (ввода команд). Если это не предусмотрено - состояние [[ -z "${1}" ]] - скрипт будет работать в текущем каталоге.
walkr /full/path/to/<directory name>
, наконец, главная функция walk() будет выполняться. 3. примеры использования:
[d63, как]следующие сделки скрипт с указанием пути назначения (ввода команд). Если это не предусмотрено - состояние [[ -z "${1}" ]] - скрипт будет работать в текущем каталоге.
walkr /full/path/to/<directory name>
[!d63, как теперь мы можем выполнить несколько тестов: [d64 с], чтобы выполните walkr для любой другой каталог:[!d64 с] #!/bin/bash
[[ -z "${1}" ]] && ABS_PATH="${PWD}" || cd "$1" && ABS_PATH="${PWD}"
[[ -z "${2}" ]] && NFK='7' || NFK="$2" # Number of the files to be kept
[[ -z "${3}" ]] && REC='1' || REC="$3" # REC='1' - work recursively
[[ -z "${4}" ]] && VRB='1' || VRB="$4" # VRB='1' - work in verbose mode
file_operations() {
local IFS=$'\t\n' # Change the value of the Internal Field Separator locally
if [ "$VRB" == "1" ]
then # Verbose mode:
rm -v $(ls -lt | grep -Po '^-.*[0-9]{2}:[0-9]{2} \K.*' | tail -n +"$((NFK+1))") 2>/dev/null && printf " -from: '%s' \n" "$1" || echo "nothing to remove in: '$1'"
else # Quiet mode:
rm $(ls -lt | grep -Po '^-.*[0-9]{2}:[0-9]{2} \K.*' | tail -n +"$((NFK+1))") 2>/dev/null
fi
}
walk() {
# Change directory to the destination path and call the above function, pass $1 for the verbose mode
cd "$1" && file_operations "$1"
# If REC='1': Recursive mode -- Make the recursion; otherwise work on the curent level
if [ "$REC" == "1" ]; then for item in "$1"/*; do [[ -d "$item" ]] && walk "$item"; done; fi
}
walk "${ABS_PATH}"
теперь мы можем выполнить несколько тестов: теперь мы можем выполнить несколько тестов:
walkr '<destination path>' '<number of lines to be kept>' '<no recursion>' '<quiet>'
, где точное содержание [f55, которая] и <quiet> не имеет никакого значения. Просто входных переменных $3 и $4 не должен быть пустым, чтобы быть перезаписаны поведение по умолчанию. я бы предложил другое решение, что буду ходить рекурсивно в рамках целевой структуры дерева каталогов и удалить все файлы, но кроме предварительно определенное количество новых файлов. Это решение базируется на: (1) Рекурсивный баш скрипт и (2) объяснить Shell-скрипт рекурсивно распечатать полный каталог дерева.
1. Создать исполняемый файл, скрипт, называется walkr (ходьбы и удалить), которая находится в [F10] для того, чтобы быть доступным в качестве командной оболочки (Рекурсивный скрипт).
1. содержание сценарии на [F11] - это очень просто:
#!/bin/bash
[[ -z "${NFK}" ]] && NFK='7' || NFK="$NFK"
[[ -z "${1}" ]] && ABS_PATH="${PWD}" || cd "${1}" && ABS_PATH="${PWD}"
file_operations() {
local IFS=$'\t\n' # Change the value of the Internal Field Separator locally
rm $(ls -lt | grep -Po '^-.*[0-9]{2}:[0-9]{2} \K.*' | tail -n +"$((NFK+1))") 2>/dev/null
}
walk() {
cd "$1" && file_operations # Change directory to the destination path and call the above function
for item in "$1"/*; do [[ -d "$item" ]] && walk "$item"; done # Make the recursion
}
walk "${ABS_PATH}"
3. Объяснение:
в начале скрипт будет проверять, если переменная $NFK (что определенное количество файлов, которые будут храниться) устанавливается заранее - условие [от f13]. Если это не задано значение по умолчанию 7. Следующие сделки скрипт с указанием пути назначения (ввода команд). Если это не предусмотрено - состояние [[ -z "${1}" ]] - скрипт будет работать в текущем каталоге. Наконец основная функция walk() будет выполняться. в начале скрипт будет проверять, если переменная $NFK (что определенное количество файлов, которые будут храниться) задается заранее - условие [от f13]. Если это не задано значение по умолчанию 7.в начале скрипт будет проверять, если переменная $NFK (что определенное количество файлов, которые будут храниться) устанавливается заранее - условие [от f13]. Если это не задано значение по умолчанию 7.
изначально он будет установить локальное значение переменной внутреннего Баш [f25 привод датчика], таким образом мы можем правильно обращаться <the list of the files to be removed>, ни есть пространства внутри отдельных имен файлов. Далее команда rm $(<the list of the files to be removed>) будет выполняться. Перенаправление ошибок 2>/dev/null для этих случаев, когда нечего убрать. <the list of the files to be removed> берется таким образом: команда [f30 с] появится список содержимого текущего каталога в формате листинга -l и список будет отсортирован по времени модификации, сначала новые [f32 из]. И этот список передается | к следующей команде. Следующая команда grep -Po '^-.*[0-9]{2}:[0-9]{2} \K.*' будет обрезать эти строки, которые начинаются ^ с [f36 в]†, от их начала до образца [fунции f37]‡. Параметр -P с параметром -o будет выводить строки, соответствующие шаблону ^-.*[0-9]{2}:[0-9]{2}_. В \K уведомление будет игнорировать подобранные детали перед собой. (источник - этот полезный ответ) †таким образом мы получим только имена файлов из списка. В выход ls -l линии, которые описывают каталоги, начать с d, и эти файлы начинаются с [пулемет f44]. (источник идеи) ‡этот шаблон совпадает с форматом времени [f45 с]. Наконец, команда tail -n +"$((NFK+1)) будут резать первых строках нашего списка файлов. Числа эти первые строки равен значению $NFK плюс 1, это требование команды tail.функция file_operations():
в начале скрипт будет проверять, если переменная $NFK (что определенное количество файлов, которые будут храниться) задается заранее - условие [от f13]. Если это не задано значение по умолчанию 7.
изначально он будет установить локальное значение переменной внутреннего Баш [f25 привод датчика], таким образом мы можем правильно обращаться <the list of the files to be removed>, ни есть пространства внутри отдельных имен файлов. Далее команда rm $(<the list of the files to be removed>) будет выполняться. Перенаправление ошибок 2>/dev/null для этих случаев, когда нечего убрать. <the list of the files to be removed> берется таким образом: команда [f30 с] появится список содержимого текущего каталога в формате листинга -l и список будет отсортирован по времени модификации, сначала новые [f32 из]. И этот список передается | к следующей команде. Следующая команда grep -Po '^-.*[0-9]{2}:[0-9]{2} \K.*' будет обрезать эти строки, которые начинаются ^ с [f36 в]†, от их начала до образца [fунции f37]‡. Параметр -P с параметром -o будет выводить строки, соответствующие шаблону ^-.*[0-9]{2}:[0-9]{2}_. В \K уведомление будет игнорировать подобранные детали перед собой. (источник - этот полезный ответ) †таким образом мы получим только имена файлов из списка. В выход ls -l линии, которые описывают каталоги, начать с d, и эти файлы начинаются с [пулемет f44]. (источник идеи) ‡этот шаблон совпадает с форматом времени [f45 с]. Наконец, команда tail -n +"$((NFK+1)) будут резать первых строках нашего списка файлов. Числа эти первые строки равен значению $NFK плюс 1, это требование команды tail. следующие сделки скрипт с указанием пути назначения (ввода команд). Если это не предусмотрено - состояние [[ -z "${1}" ]] - скрипт будет работать в текущем каталоге.следующим сценарием занимается путь назначения (ввода команд). Если это не предусмотрено - состояние [[ -z "${1}" ]] - скрипт будет работать в текущем каталоге.
walkr /full/path/to/<directory name>
, наконец, главная функция walk() будет выполняться. 3. примеры использования:
[d63, как]следующие сделки скрипт с указанием пути назначения (ввода команд). Если это не предусмотрено - состояние [[ -z "${1}" ]] - скрипт будет работать в текущем каталоге.
walkr /full/path/to/<directory name>
[!d63, как теперь мы можем выполнить несколько тестов: [d64 с], чтобы выполните walkr для любой другой каталог:[!d64 с] #!/bin/bash
[[ -z "${1}" ]] && ABS_PATH="${PWD}" || cd "$1" && ABS_PATH="${PWD}"
[[ -z "${2}" ]] && NFK='7' || NFK="$2" # Number of the files to be kept
[[ -z "${3}" ]] && REC='1' || REC="$3" # REC='1' - work recursively
[[ -z "${4}" ]] && VRB='1' || VRB="$4" # VRB='1' - work in verbose mode
file_operations() {
local IFS=$'\t\n' # Change the value of the Internal Field Separator locally
if [ "$VRB" == "1" ]
then # Verbose mode:
rm -v $(ls -lt | grep -Po '^-.*[0-9]{2}:[0-9]{2} \K.*' | tail -n +"$((NFK+1))") 2>/dev/null && printf " -from: '%s' \n" "$1" || echo "nothing to remove in: '$1'"
else # Quiet mode:
rm $(ls -lt | grep -Po '^-.*[0-9]{2}:[0-9]{2} \K.*' | tail -n +"$((NFK+1))") 2>/dev/null
fi
}
walk() {
# Change directory to the destination path and call the above function, pass $1 for the verbose mode
cd "$1" && file_operations "$1"
# If REC='1': Recursive mode -- Make the recursion; otherwise work on the curent level
if [ "$REC" == "1" ]; then for item in "$1"/*; do [[ -d "$item" ]] && walk "$item"; done; fi
}
walk "${ABS_PATH}"
теперь мы можем выполнить несколько тестов: теперь мы можем выполнить несколько тестов:
walkr '<destination path>' '<number of lines to be kept>' '<no recursion>' '<quiet>'
, где точное содержание [f55, которая] и <quiet> не имеет никакого значения. Просто входных переменных $3 и $4 не должен быть пустым, чтобы быть перезаписаны поведение по умолчанию.