Ваша функция отключает подстановку имен файлов, но вы вызываете ее с подстановкой, которую расширяет оболочка (подстановка имен файлов не отключена в оболочке, из которой вы ее вызываете ).
Другими словами, шар в вашей команде
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[@]}"
}
Переместить установки 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. Это редко, но это случается.