Вам необходимо указать абсолютный путь к файлу ядра. Абсолютный путь начинается с корневого каталога и начинается с /
. Если /boot
находится на корневом разделе, это означает
kernel /boot/vmlinuz
Если /boot
находится на отдельном разделе, это означает
kernel /vmlinuz
То же самое относится к initrd.img
.
Кроме того, вам может понадобиться оператор root
, чтобы указать Grub на раздел, где находятся эти файлы. В Grub legacy это что-то вроде root (hd0,5)
для того, что в Linux называется /dev/sda6
(Grub нумерует разделы с 0, Linux - с 1). Директива uuid
играет ту же роль, если ваша версия Grub поддерживает её.
В обычной установке Debian, /boot/vmlinuz
и /boot/initrd.img
являются символическими ссылками, которые указывают на файл под названием vmlinuz-VERSION
(или initrd.img-VERSION
), где VERSION обозначает последнюю установленную версию ядра. В зависимости от конфигурации, эти символы могут находиться в корневом каталоге (но это не работает, если /boot
находится в отдельном разделе). Grub может читать символические ссылки (если они находятся в одном разделе), поэтому вы можете использовать их, чтобы избежать жесткого кодирования номера версии ядра в конфигурации загрузчика.
find
действия также являются тестами, поэтому вы можете добавить тесты, используя-exec
:
find. \( -exec [ -f {}/.git ] \; -prune \) -o \( -name.git -prune \) -o -print
Это относится к трем наборам действий:
-exec [ -f {}/.git ] \; -prune
удаляет каталоги, содержащие файл с именем.git
-name.git -prune
удаляет каталоги с именем .git
(, чтобы команда не выполняла поиск в основном каталоге .git
репозитория)-print
печатает все, что не попадает под действие приведенного выше. Чтобы сопоставлять только каталоги, добавьте -type d
либо непосредственно перед -print
, либо (, чтобы сэкономить время на обработку файлов):
find. -type d \( \( -exec [ -f {}/.git ] \; -prune \) -o \( -name.git -prune \) -o -print \)
Это также работает при запуске в каталоге, отличном от .
, путем изменения начального пути find
:
find /some/other/path -type d \( \( -exec [ -f {}/.git ] \; -prune \) -o \( -name.git -prune \) -o -print \)
Немного грязный скрипт, но он найдет все каталоги, в которых нет файла .git
:
#!/bin/bash
# find dirs that contain *.git files and store in array
exclude_dirs=($(find. -type f -iname ".git" | xargs -i dirname {}))
# set up the base command
command="find. -type d"
# loop over each element in array by index
for i in $(seq 0 $(expr ${#exclude_dirs[@]} - 1)); do
command="${command} -not -path ${exclude_dirs[$i]}"
done
# run the find
eval ${command}
исправлены синтаксические ошибки и обновлены *.git
до.git
да, это было неправильно, приношу свои извинения. Отредактировано, так что теперь это действительно работает.
Мы можем создать рекурсивныйfind
:
Добавьте следующие строки в файл скрипта:
#!/bin/bash
if [ ! -f "$1"/.git ]; then
echo "$1"
find "$1" -mindepth 1 -type d -prune -exec "$0" {} \;
fi
Я назвал файл findifnotgit
, но это не имеет значения. Затем сделайте его исполняемым
chmod u+x findifnotgit
Затем запустите его с путем, который вы хотите запустить в качестве аргумента:
./findifnotgit.
--> .
для текущего каталога
или
./findifnotgit /path/to/search/
Пояснение:
if [ ! -f "$1"/.git ]; then... fi
Запускайте следующее, только если в текущей папке нет файла .git
($1
)-mindepth 1
, чтобы разрешить поиску не находить папку, с которой мы начали, что создало бы бесконечный цикл. -prune
чтобы find не спускался в каталоги. Мы сделаем это сами внутри -exec
. -exec "$0" {}
вызовет тот же скрипт $0
с находками. Вот как указать find не заглядывать внутрь репозиториев.git или.hg.
find. \( -iname '.git' -o -iname '.hg' \) -prune -false -o -iname '*thing-i-am-looking for*'