найдите с-execdir

/etc/resolv.conf перечисляет серверы имен что Ваше компьютерное использование для поиска имен DNS. Для отправки пакетов в компьютер необходимо знать его IP-адрес, но IP-адреса (более или менее) связываются с конкретным Интернет-провайдером и местоположением, и могут измениться, таким образом, они обычно не используются для обозначения компьютеров. Вместо этого имена DNS используются.

Обычно, кто бы ни обеспечивает Ваш доступ в Интернет (например, Ваш ISP) обеспечивает серверы имен для использования. К самим серверам имен нужно получить доступ через их IP-адрес, конечно. Обычно, когда Вы соединяетесь с DHCP или PPP, Ваш компьютер получает адреса сервера DNS и обновления программного обеспечения /etc/resolv.conf автоматически, чтобы добавить адреса серверов DNS Вашего поставщика и удалить их, когда Вы разъединяетесь.

В простых случаях Вам только нужен единственный сервер DNS, перечисленный в /etc/resolv.conf. Тот сервер опросит другие серверы по мере необходимости, если он не будет иметь ответа на запрос. Часто, когда Вы соединяетесь через поставщика или в крупной организации, Вы будете видеть два адреса: основной сервер и сервер нейтрализации в случае, если основной сервер идет офлайн.

С находящимися в Debian дистрибутивами удостоверьтесь, чтобы Вы имели resolvconf пакет установил (он теперь установлен по умолчанию в соответствии с Ubuntu), поскольку он заботится об управлении /etc/resolv.conf. Это обычно разбирается в вещах автоматически, и если это не делает легко настроить.

Если с Вашими двумя VPNs можно использовать единственный сервер имен, примите меры, чтобы некоторый рабочий сервер имен закончился в /etc/resolv.conf. Предпочтительно, настройте клиента VPN, от которого Вы не хотите DNS не перезаписать /etc/resolv.conf (любой хороший клиент VPN должен иметь это как опцию в ее конфигурационном файле или в сопутствующем сценарии).

При необходимости в нескольких серверах имен, например, потому что каждая VPN предоставляет Вам доступ к различной внутренней сети, необходимо будет соединиться с единственным сервером имен, который диспетчеризирует запросы. Я рекомендую dnsmasq, который легок, легок настроить, и достаточно мощный для большей части единственной машины и установок небольшой сети. Если Вы выполняете свой собственный сервер имен, /etc/resolv.conf должен содержать nameserver 127.0.0.1 и никто другой nameserver директива, поэтому удостоверьтесь что ни одно из Вашего переопределения клиентов VPN это.

15
20.07.2016, 23:52
3 ответа

Для каждого файла соответствия (т.е. каждого каталога), find переключатели к каталогу, который содержит его (т.е. его родительский каталог) и выполняет указанную команду. Так как команда не использует название соответствия, это никогда не собирается действовать на все каталоги. Для этого конкретного дерева каталогов Вы делаете

(cd . && touch foo)        # because ./a matches
(cd ./a && touch foo)      # because ./a/b matches
(cd ./a/b && touch foo)    # because ./a/b/c matches

Для создания файла в каждом каталоге можно просто использовать -exec вместо -execdir, если Ваша реализация find позволяет {} в аргументе (большинство делает, и в особенности я думаю все те):

find . -type d -exec touch {}/foo +

Для мобильности POSIX необходимо было бы сделать сборку имени каталога и базового имени файла вручную.

find . -type d -exec sh -c 'touch "$0/foo"' {} \;

или (немного быстрее)

find . -type d -exec sh -c 'for d; do touch "$d/foo"; done' _ {} +

С другой стороны, можно использовать рекурсивное подстановочное соответствие удара. Остерегайтесь этого (в отличие от соответствующей функции в ksh и zsh, и в отличие от Вашего find команда), удар рекурсивно вызывает под символьными ссылками на каталоги.

shopt -s globstar
for d in **/*/; do touch -- "$d/foo"; done

zsh решение:

touch ./**/(e\''REPLY+=foo'\')
18
27.01.2020, 19:49
  • 1
    К вашему сведению: man bash состояния под "-c": аргументы после command_string присвоены позиционным параметрам, запускающимся с 0$, однако "для d" выполнит итерации через позиционные параметры, запускающиеся с 1$. "_" текст, который присвоен 0$ и не будет использоваться. –  Chad Skeeters 29.06.2016, 20:54

От man file

   -execdir command {} +
          Like  -exec,  but  the  specified  command is run from the subdirectory containing the matched file

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

Вы могли, вероятно, достигнуть того, что Вы хотите путем отправки каталогов в xargs поскольку это будет предоставлено полный список каталогов.

2
27.01.2020, 19:49

Команда выполняется в каждом каталоге, который содержит подобранный файл. С тех пор c не содержит каталог, он не соответствует и таким образом не будет выполнен туда.

Решение состоит в том, чтобы добавить имя каталога к execdir аргументу, как так:

find . -type d -execdir touch {}/foo \;
3
27.01.2020, 19:49

Теги

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