Установка двойной загрузки

Ваша функция отключает подстановку имен файлов, но вы вызываете ее с подстановкой, которую расширяет оболочка (подстановка имен файлов не отключена в оболочке, из которой вы ее вызываете ).

Другими словами, шар в вашей команде

find -name *c

раскрывается перед вызовом вашей функции find. Это приводит к вызову findвнутри функции, которую утилита не может понять.

Это можно решить, вызвав функцию с аргументом в кавычках:

find -name "*c"

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

В вдобавок к тому, что он бесполезен, это тоже неправильно. Поскольку $@не заключен в кавычки в вашем коде, он будет разделять аргументы на пробелы (по умолчанию ). Это означает, что вы не можете использовать, например.

find -name "* *"

, чтобы найти имена с пробелами в них.

Также обратите внимание, что из-за evalоболочка будет выполнять раскрытие содержимого $@. Это означает, что

find -name '$(echo hello)'

не найдет файлы с именем $(echo hello), но hello.

Другое дело, что если вызывающая оболочка уже использует set -f, то это будет отключено функцией.


Давайте вместо этого создадим полезную функцию. Функция, которая ищет количество шаблонов имен файлов, например:

myfind "*.c" "*.txt" "* *"

Мы хотим, чтобы приведенная выше команда возвращала пути, которые заканчиваются на .cили .txtили содержат пробелы.

Вот функция:

myfind () {
    # Replace each positional parameter "$pattern"
    # with -o -name "$pattern"
    for pattern do
        set -- "$@" -o -name "$pattern"
        shift
    done
    shift  # shift off the initial "-o"

    find. "$@"
}

Учитывая приведенный выше вызов функции, она завершится выполнением

find. -name '*.c' -o -name '*.txt' -o -name '* *'

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

myfind () {
    local -a args

    # Build the argument list for find by adding
    # -o -name "$pattern"
    # for each positional parameter 
    for pattern do
        args+=( -o -name "$pattern" )
    done
    args=( "${args[@]:1}" )  # remove the initial "-o"

    find. "${args[@]}"
}
0
26.06.2020, 14:09
1 ответ

Переместить установки Windows непросто, и да, это выходит за рамки этого сайта. Однако по опыту я бы не стал пытаться переместить установку Windows, если вы не собираетесь полностью переустанавливать ее. Поскольку он был установлен до -, у вас почти наверняка нет установочного носителя для новой установки.

Основное различие между UEFI и устаревшей версией заключается в том, что UEFI хранит файл в отформатированном разделе (разделе EFI ), где устаревшая версия устанавливает его (или его часть )в начале диска или раздел.

В отличие от устаревшей версии, UEFI поддерживает одновременную установку нескольких загрузчиков; у них просто разные имена файлов. Таким образом, вы можете аккуратно установить несколько операционных систем в любом месте, не изолируя ОС на каждом диске 1 .

На моем месте я бы сжал ваш диск Windows c:на SSD. И установите корневую(/)файловую систему Kali в новый раздел на SSD. Мне никогда не требовалось более 50 ГБ для дистрибутива Linux. Если вы планируете хранить что-то громоздкое в Kali, вы всегда можете добавить раздел на свой большой жесткий диск и смонтировать его как /home. Kali любит делать все как root, чтобы вы могли принимать собственные решения о /root.

Цель этого способа заключается в том, что сжатие разделов Windows относительно тривиально по сравнению с их полным перемещением (по моему опыту ). Твердотельные накопители значительно улучшают производительность, когда на них установлены ваши программные файлы. SSD имеют меньшее значение, когда ваши документы хранятся на них.


1 Одно предостережение... Большие обновления Windows (Обновление Windows? Известно, что )полностью сбрасывает/переформатирует раздел UEFI. Это редко, но это случается.

1
18.03.2021, 23:24

Теги

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