Существует ли способ указать раздел конвейера «пройти через»?

Вы могли бы сделать это в два шага, сначала переместив файлы, а затем удалив теперь пустой родительский каталог:

mkdir -p to/there
mv from/here/* to/there
rmdir from/here

В вашем конкретном случае фрагмент

if [[ "$stringOldDir" == "$stringNewDir" ]] ; then  
   echo "Match strings "$stringOldDir" and "$stringNewDir""
   if [[ ! -d "move_to" ]] ; then
     mkdir -v "$move_to"
     mv -vf "$OldDirName" "$move_to" 
   else
     mv -fv "$OldDirName" "$move_to" 
   fi
 fi

может быть заменен примерно так:

mkdir -p "$move_to/$OldDirName"
mv "$OldDirName"/* "$move_to/$OldDirName"
rmdir "$move_to/$OldDirName"

-121--209516-

Как я уже прокомментировал, ваше первое расширение ничего не делает. Строка литерала («») отсутствует в последовательности, поэтому ничего не удаляется. Затем второе расширение удаляет все символы, которые не являются буквой или космосом. Вот почему «CD» остается. В вашем коде нет ничего, что могло бы понизить регистр «d» в «CD».

Если вы хотите удалить все биты в скобках:

shopt -s extglob
NewDirectoryName='Dio - We Rock-Greatest Hits (2CD) (2004)'

NewDirectoryName=${NewDirectoryName//\(*([^\)])\)}
# ...................................aa........cc
# .....................................bbbbbbbb
# (a) a literal open parenthesis
# (b) zero or more non-close-parenthesis characters
# (c) a literal close parenthesis

echo ">$NewDirectoryName<"
>Dio - We Rock-Greatest Hits  <

Для удаления последнего пробела:

NewDirectoryName=${NewDirectoryName%%+([[:blank:]])}

Используются узоры «расширенного сопоставления образцов», задокументированные в конце этого раздела руководства: https://www.gnu.org/software/bash/manual/bashref.html#Pattern-Matching

-121--105114-

У вас нет сертификатов, где их ожидает git. На тот же вопрос был дан ответ здесь .

1
18.09.2018, 10:05
5 ответов

Я не знаю ни одного решения systemd, но вы можете эффективно отслеживать изменения в интерфейсах с помощью ip monitorи направлять вывод в сценарий, который ищет интересующие вас изменения. Например, если я сделаю

$ ip monitor address dev enp3s0

затем добавьте новый псевдоним к интерфейсу enp3s0. Я получаю строку

2: enp3s0    inet 192.168.77.77/24 brd 192.168.77.255 scope global enp3s0:1
       valid_lft forever preferred_lft forever

Я предполагаю, что вы увидите нечто подобное для изменений DHCP.

Если вы предпочитаете, вы можете написать программу на C, чтобы сделать то же самое, см. этот ipevent.c .

3
27.01.2020, 23:18

Взгляните на сетевой -диспетчер. Это демон, запускающий сценарии из /etc/networkd-dispatcher/*.dпри различных сетевых событиях. Сведения о событиях передаются сценариям через переменные среды.

1
27.01.2020, 23:18

Многие пакеты не работают с systemd-networkd... пока.(см. отчет об ошибках на LaunchPad)

На данный момент DHCP-клиент ISC(dhclient)по-прежнему безраздельно господствует, особенно в пользовательском DHCP -Опция, необходимая DHCP-серверам многих интернет-провайдеров (Я смотрю на вас, Juniper Networks ), а также на поддержку Скрипты ОС -.

Итак, перейдите к /etc/systemd/network, чтобы отредактировать файл конфигурации, связанный с динамической IP-адресацией, и отключить DHCP systemd в следующем:

[Match]
Name=eth1
[Network]
# Using ISC DHCP client (dhclient) instead of systemd-networkd
# Better support of DHCP-Options and OS-specific script supports
DHCP=no

Затем убедитесь, что для клиента ISC DHCP(dhclient/etc/network/interfaces:

auto eth0
iface eth0 inet dhcp

И для/etc/dhcp/dhclient.conf:

send host-name "Wireless_Broadband_Router";
send domain-name "home";
request subnet-mask, broadcast-address, time-offset, routers,
    domain-name, domain-name-servers, time-servers, log-servers,
    default-ip-ttl, dhcp-requested-address, dhcp-lease-time,
    dhcp-server-identifier,dhcp-parameter-request-list,
    vendor-class-identifier,dhcp-client-identifier,
    www-server,
    dhcp6.name-servers, dhcp6.domain-search, dhcp6.fqdn, 
    dhcp6.sntp-servers,
    interface-mtu,
    ntp-servers;

Последним шагом является запуск systemd DHCP-клиента ISC в качестве демона. Создайте файл в /etc/systemd/system/dhclient@.service.

# cat /etc/systemd/system/dhclient@.service 
[Unit]
Description=dhclient on %I
Wants=network.target
Before=network.target
BindsTo=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

[Service]
# ExecStart=/sbin/dhclient -4 -q %I
ExecStart=/sbin/dhclient -4 -v -pf /run/dhclient.%I.pid -lf /var/lib/dhcp/dhclient.%I.leases %I

[Install]
WantedBy=multi-user.target

И сделать DHCP-клиент ISC доступным для демона systemdпутем запуска из оболочки:

sudo systemctl daemon-reload   #makes the dhclient@.service available
sudo systemctl enable dhclient@eth0.service
sudo systemctl start dhclient@eth0.service
1
27.01.2020, 23:18

сетевой -диспетчер

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

В зависимости от того, в каком состоянии должен выполняться ваш скрипт, вам нужно решить, в какую папку поместить ваш скрипт.

Пример:

Мы будем использовать папку routable.d, когда для ссылки настроены оператор связи и маршрутизируемый адрес .

Скопируйте файл сценария в/usr/lib/networkd-dispatcher/routable.d

cp path/to/my/ipchange_script.sh /usr/lib/networkd-dispatcher/routable.d

ipchange _script.sh

#!/bin/bash


if [[ $IFACE == "eth0" && $AdministrativeState == "configured" ]]; then
    echo "IP Address has changed to: $ADDR"  >> /tmp/iplog.txt
fi

exit 0

Обновите свой IP-адрес (dhclient -r eth0 && dhclient -v eth0), затем, чтобы увидеть вывод вашего скрипта или увидеть, есть ли в вашем скрипте какие-либо ошибки, которые вы можете проверить с помощью команды:

sudo service networkd-dispatcher status

П.С. Я искал несколько месяцев, и нигде не было примеров того, как работать с networkd-dispatcher. Только сегодня смог разобраться. Наслаждаться!

2
11.03.2020, 08:55

Использовать NetworkManager

Мне не удалось заставить networkd-dispatcherреагировать на изменения dhcp в Ubuntu Server 20.04, но NetworkManager (, который заменил systemd-networkdв Ubuntu Desktop ), может.

  1. Установить NetworkManager
sudo apt install network-manager

Отредактируйте файл конфигурации в/etc/netplan/:

network:
  version: 2
  renderer: NetworkManager

sudo netplan generateдля создания файлов конфигурации для NetworkManager

  1. Отключить systemd-networkdи перезагрузить
sudo systemctl mask systemd-networkd
sudo reboot now
  1. Поместите свой скрипт в/etc/NetworkManager/dispatcher.d

NetworkManager запустит его с $1 = интерфейс, $2 = действие (для, например, dhcp-change,up)и установит некоторые переменные среды. См. его руководствоhttps://developer.gnome.org/NetworkManager/stable/NetworkManager.html

1
24.08.2020, 11:40

Теги

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