Короткий путь к `cd` во 2-ю папку в каталоге

Это не прямое решение, но, похоже, вы можете использовать функцию on commit в вашем файле конфигурации DHCP. Вот пример из этой статьи под названием: Выполнение сценария при передаче ISC DHCP новой аренды.

В файле dhcpd.conf вы можете создавать действия на различные события, например, когда выдается аренда.

subnet 192.168.1.0 netmask 255.255.255.0 {
    option routers  192.168.1.2;

    on commit {
        set clip = binary-to-ascii(10, 8, ".", leased-address);
        set clhw = binary-to-ascii(16, 8, ":", substring(hardware, 1, 6));
        execute("/usr/local/sbin/dhcpevent", "commit", clip, clhw, host-decl-name);
    }
    ...

При запуске вышеприведенного скрипта, dhcpevent, ему передается 4 аргумента.

execute_statement argv[0] = /usr/local/sbin/dhcpevent
execute_statement argv[1] = commit
execute_statement argv[2] = 192.168.1.40
execute_statement argv[3] = 11:aa:bb:cc:dd:ee
execute_statement argv[4] = d1.jp

clipw и clhw - переменные, в которых, в данном примере, части других метаданных были разобраны и сохранены до запуска скрипта. Эти переменные затем передаются вместе с другими элементами в сценарий события.

Вы могли бы использовать этот подход в сценарии, где вы могли бы отслеживать количество IP, которые были сданы в аренду, или, возможно, вы могли бы опросить фактический файл состояния аренды, который DHCP-сервер отслеживает эту информацию (/var/lib/dhcpd/dhcpd.leases), а затем сообщить, если в этом файле есть количество аренд, превышающее вашу квоту.

Ссылки

0
11.02.2019, 13:59
3 ответа

По умолчанию глобусы оболочки упорядочены в лексикографическом порядке, а Zsh позволяет напрямую индексировать результаты глобусов, поэтому вы можете сделать что-то вроде этого:

cd2() {
    cd -- */([2]);       # indexing starts at one
}

В Bash вы можете сделать то же самое с массивом:

cd2() {
    local dirs=(*/)
    cd -- "${dirs[1]}"   # indexing starts at zero
}

Оба по существу предполагают, что существует по крайней мере два совпадения с глобусом. См. ответ Кусалананды , чтобы узнать, как справиться с этим предположением.

Кроме того, если у вас есть lsпсевдоним, так что ему присвоены некоторые флаги, порядок сортировки может отличаться от порядка сортировки оболочек. (У меня есть lsпсевдоним ls -vF --color=autoв Linux, -vизменяет даже порядок сортировки aи _. )Zsh, конечно же, предоставит вам несколько других вариантов сортировки.


Обратите внимание, что хотя вы можете использовать что-то вроде ls | head -2 | tail -1для получения второго имени файла в списке вывода ls, это не работает для имен файлов с символами новой строки и требует не одного, а трех внешних процессы, чтобы сделать что-то, что оболочка может сделать сама, так что это не очень хорошее решение. ls */еще глупее, так как здесь это оболочка , которая расширяет глобус, а lsпросто выводит полученные имена.См.https://mywiki.wooledge.org/ParsingLsдля получения дополнительной информации о том, как полагаться на вывод lsможет быть проблематично.

5
28.01.2020, 02:13

Используя zsh, следующее будет cdво второй каталог в текущем каталоге:

cd./*(/[2])

/внутри круглых скобок является модификатором глобуса *, который делает его совпадающим только с именами каталогов (см. руководство zshexpn[2]извлечь второй каталог, который этот глобус Спички.

Оборачиваем это в функцию:

cd2nd () { cd./*(/[2]); }

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

cd2nd () { [ -d./*(/[2]) ] && cd./*(/[2]); }

Но теперь мы расширяем шаблон дважды .

В/bin/sh(илиzsh)с совпадением только одного универсального объекта:

cd2nd () { set --./*/; [ -d "$2" ] && cd "$2"; }

При этом используются позиционные параметры для хранения имен всех подкаталогов.(*/Соответствуют только каталогам ), проверяется существование второго и выполняется переход к этому каталогу, если он существовал.

3
28.01.2020, 02:13

Функция, принимающая в качестве аргумента номер каталога, должна измениться на

function ff()
{
    cd "$(ls -d */ | head -n $1 | tail -n 1)";
}

Использование:

user@localhost:~ $ ff 2
user@localhost:~/Desktop $

Пояснение:

  • ls -d */список всех каталогов в текущем каталоге
  • head -n $1перечисляет только $1первые каталоги, а $1является аргументом нашей функции, поэтому, если вы вызовете cc 2, тогда $1примет значение2(первые две строки сейчас обрабатываются ).
  • tail -n 1выбирает только последнюю строку
  • Все это отправляется команде cd, поэтому каталог изменяется на правильный (кавычки присутствуют, поэтому имена каталогов с пробелами будут анализироваться как один аргумент)

Внимание!

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

1
28.01.2020, 02:13

Теги

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