Удалять старые файлы рекурсивно до достижения максимального предела

Измените lightdm.conf на:

[SeatDefaults]
user-session=ubuntu
greeter-session=unity-greeter
allow-guest=false

без пробелов.

3
задан 27 October 2017 в 12:20

6 ответов

Если вы хотите, чтобы сценарий по-прежнему работал в одном каталоге, без рекурсии через подкаталоги, подсчет и удаление можно выполнить в цикле 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). Это будет иметь дело с ситуацией, не связанной с удалением, но я оставлю это кому-то еще.

4
ответ дан 22 May 2018 в 17:04
  • 1
    Да, именно это. – Ziazis 27 October 2017 в 11:51
  • 2
    Спасибо, я на самом деле пытался вставить этот цикл while, но не получил " local file_inodes = $ (get_files) " line, поэтому он был бесконечно циклическим даже при удалении файла. Было бы неплохо иметь более элегантный метод, описанный так, чтобы он работал в «безопасном» режиме. режим, но пока это будет сделано. – MysticEagle 28 October 2017 в 11:07

Если вы хотите, чтобы сценарий по-прежнему работал в одном каталоге, без рекурсии через подкаталоги, подсчет и удаление можно выполнить в цикле 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). Это будет иметь дело с ситуацией, не связанной с удалением, но я оставлю это кому-то еще.

4
ответ дан 18 July 2018 в 04:27

Если вы хотите, чтобы сценарий по-прежнему работал в одном каталоге, без рекурсии через подкаталоги, подсчет и удаление можно выполнить в цикле 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). Это будет иметь дело с ситуацией, не связанной с удалением, но я оставлю это кому-то еще.

4
ответ дан 24 July 2018 в 18:05

я бы предложил другое решение, что буду ходить рекурсивно в рамках целевой структуры дерева каталогов и удалить все файлы, но кроме предварительно определенное количество новых файлов. Это решение базируется на: (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 не должен быть пустым, чтобы быть перезаписаны поведение по умолчанию.
2
ответ дан 22 May 2018 в 17:04
  • 1
    спасибо за этот альтернативный метод, он выглядит довольно хорошо. Я должен проверить это более подробно, поскольку он значительно отличается от того, что я уже реализовал, но может быть действительно хорошим решением. Я думаю, что проблема с именем файла была связана с тем, почему исходный сценарий, с которого я начал, выбрал вместо него маршрут inode: исправляет ли ваш последний комментарий эту проблему? Еще раз спасибо! – MysticEagle 28 October 2017 в 11:12
  • 2
    Привет, @MysticEagle, я обновил ответ как можно лучше. Теперь скрипт правильно обрабатывает имена с пробелами. Кроме того, я добавил более полную версию скрипта. Я добавил эту версию как отдельный сценарий в нижней части ответа, с намерением сохранить вышеуказанную часть настолько простой, насколько это возможно. – pa4080 28 October 2017 в 19:50

я бы предложил другое решение, что буду ходить рекурсивно в рамках целевой структуры дерева каталогов и удалить все файлы, но кроме предварительно определенное количество новых файлов. Это решение базируется на: (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 не должен быть пустым, чтобы быть перезаписаны поведение по умолчанию.
2
ответ дан 18 July 2018 в 04:27

я бы предложил другое решение, что буду ходить рекурсивно в рамках целевой структуры дерева каталогов и удалить все файлы, но кроме предварительно определенное количество новых файлов. Это решение базируется на: (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 не должен быть пустым, чтобы быть перезаписаны поведение по умолчанию.
2
ответ дан 24 July 2018 в 18:05
  • 1
    спасибо за этот альтернативный метод, он выглядит довольно хорошо. Я должен проверить это более подробно, поскольку он значительно отличается от того, что я уже реализовал, но может быть действительно хорошим решением. Я думаю, что проблема с именем файла была связана с тем, почему исходный сценарий, с которого я начал, выбрал вместо него маршрут inode: исправляет ли ваш последний комментарий эту проблему? Еще раз спасибо! – MysticEagle 28 October 2017 в 11:12
  • 2
    Привет, @MysticEagle, я обновил ответ как можно лучше. Теперь скрипт правильно обрабатывает имена с пробелами. Кроме того, я добавил более полную версию скрипта. Я добавил эту версию как отдельный сценарий в нижней части ответа, с намерением сохранить вышеуказанную часть настолько простой, насколько это возможно. – pa4080 28 October 2017 в 19:50

Другие вопросы по тегам:

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