Найти исключающий путь, содержащий определённые файлы

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

2
15.09.2018, 22:37
4 ответа

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 \)
6
27.01.2020, 21:51

Немного грязный скрипт, но он найдет все каталоги, в которых нет файла .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

редактировать2:

да, это было неправильно, приношу свои извинения. Отредактировано, так что теперь это действительно работает.

0
27.01.2020, 21:51

Мы можем создать рекурсивный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с находками.
3
27.01.2020, 21:51

Вот как указать find не заглядывать внутрь репозиториев.git или.hg.

find.  \( -iname '.git' -o -iname '.hg' \) -prune -false  -o -iname  '*thing-i-am-looking for*'
0
27.01.2020, 21:51

Теги

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