Сбой переименования mv на основе поиска в сценарии оболочки

Я думаю, вы ищете /proc/sys/vm/overcommit_memory, для которого вам следует установить значение 2, чтобы обеспечить принудительную проверку выделения памяти (программы не смогут выделить больше памяти, чем реально доступно ). Вам, вероятно, также потребуется настроить /proc/sys/vm/overcommit_ratio, по крайней мере, если какой-либо из ваших программ необходимо выделить более половины установленной памяти. Все это документировано на procfsсправочной странице .

Я бы порекомендовал пересмотреть ваше решение отключить все ваши свопы; см. Зачем Linux нужно пространство подкачки в виртуальной машине? для получения подробной информации.

Стоит отметить, что ядро ​​не может выполнить подкачку, если подкачка отключена. Все, что он может сделать, это использовать сопоставленные файлы в качестве резервного хранилища, но это обычно не требует написания (, в частности, для исполняемых файлов и библиотек ). Если вы видите записи в состоянии стресса, это, вероятно, связано с тем, что ядро ​​сбрасывает грязные страницы (в основном из своих буферов ), чтобы попытаться восстановить их.

0
26.01.2020, 07:30
2 ответа

Начнем с двух возможных решений, а затем объясним, почему возникла ошибка.

Решение 1::

Просто "временно" экспортируйте две переменные, чтобы они были доступны для вашей под-оболочки

#!/bin/bash
# renamefiles.sh - type renamefiles <old> <new>

export from="$1" && export to="$2" && find. -type f -name "*$1*" -exec bash -c 'mv "$0" "${0/$from/$to}"' "{}" \; 2>&1 | grep -v "Permission denied"


exit 0

Итак, здесь мы экспортируем $1 в переменную from и $2 в переменную to. Таким образом оболочка sub -сможет их прочитать.

Решение 2::(проще, и его могут предпочесть те, кому не нравится временный экспорт)

#!/bin/bash
# renamefiles.sh - type renamefiles <old> <new>

find. -type f -name "*$1*" -exec bash -c 'mv "$0" "${0/$1/$2}"' "{}" "$1" "$2" \; 2>&1 | grep -v "Permission denied"

exit 0

Это решение состоит в том, чтобы просто передать «$1» и «$2» помимо {} (текущего результата поиска ), чтобы оболочка подпрограммы -могла нормально обращаться к ним, как если бы это был сценарий на ее own (за исключением того, что с опцией -c, переданной в bash, первым аргументом будет $0 вместо $1; это, кажется, известно вам, так как вы уже использовали это)

Общие сведения о двух решениях::

  1. Всегда добавляйте команду выхода в конец скрипта
  2. Обратите внимание на кавычки для каждой передаваемой переменной, даже для {}. Это предотвратит неправильное толкование переменных с пробелами. Сделайте это, даже если вы уверены, что у вас нет значений или [здесь] имен файлов с пробелами, так как вы не знаете, когда позже будете использовать свой сценарий.

Причина ошибки::

Причина ошибки, которую вы получили ("один и тот же файл" ), очень проста.

В вашем скрипте команда mv заменила данный файл "$0" другим файлом, полученным в результате замены строки ("${0/$1/$2}" ). Итак, в вашем случае $1 и $2 не были переданы команде оболочки sub -, так что это похоже на то, что вы сделали «${0/}», что ничего не сделает. В результате старое и новое имена файлов будут одинаковыми,отсюда и ошибка.

0
28.01.2020, 02:54

Параметры в вашем скрипте заключаются в одинарные кавычки 'mv "$0" "${0/$1/$2}"', что предотвращает их неправильную интерпретацию.

Следующее работает:

#!/bin/bash
# renamefiles.sh - type renamefiles <old> <new>
# 
find. -type f -name "*$1*" -exec bash -c 'mv "$0" "${0/'"$1/$2"'}' {} \; 2>&1 | grep -v "Permission denied" | grep -v "are the same file"

Обратите внимание на то, что $1и $2больше не в одинарных кавычках, а в двойных кавычках — способ, которым что-то цитируется, может иметь решающее значение.

0
28.01.2020, 02:54

Теги

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