Родительский дочерний каталог с тем же именем, переместить файлы в родительский каталог

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

Это слишком важное решение — оставить на усмотрение распознавателя реализацию клиентов.

Хотя теоретически клиенты должны возвращаться ко 2-му DNS в случае сбоя 1-го, часто этого не происходит по нескольким причинам. За годы своей карьеры я видел огромные сбои в полных сетях, когда люди реализовывали вещи, рассчитывая на то, что распознаватель клиентской операционной системы достаточно умен.

Обычно вы делаете то же, что и корневые серверы имен, то есть создаете DNS-кластеры для получения виртуальных IP-адресов ваших DNS-серверов. Чаще всего для этого используется технология DNS anycast. Вы также можете попробовать более простые архитектуры, такие как использование keepdalived.

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

см. Anycast IPv4 с Linux и Quagga

The traditional safeguard is to establish multiple DNS servers for a given site. Each DNS client on the network is configured with each of those servers' IP addresses. The chances of all of those servers failing in a catastrophic way are fairly small, so you have a margin of safety.

On the other hand, many stub resolvers will take only two DNS servers, making it nearly impossible to have any meaningful geographical dispersion in your DNS topology. DNS stub resolvers generally use the first of two configured DNS servers exclusively. Consequently, you end up with one server taking the entire query load and one idling, waiting for a failure. Not optimal, but hey, that's the price of redundancy...right? It doesn't have to be.

DNS redundancy and failover is a classic use case for anycast. Anycast is the concept of taking one IP address and sharing it between multiple servers, each unaware of the others. The DNS root nameservers make extensive use of anycast.

ПС. В прошлом я внедрил Anycast DNS с iBGP и OSPF у двух интернет-провайдеров и в одном университете, что значительно улучшило доступность службы DNS во время безотказной работы.

3
06.06.2021, 23:31
2 ответа

С помощью zshможно сделать:

for dir in **/*(NDodoN/e['[[ $REPLY:t = $REPLY:h:t ]]']); do
  contents=($dir/*(NDoN))
  (( $#contents == 0 )) ||
    mv -- $contents $dir:h/ &&
    rmdir -- $dir
done

Где:

  • **/*(qualifiers)рекурсивная подстановка с помощью квалификаторов подстановки
  • N:nullglob :не жаловаться, если совпадений нет
  • D:dotglob :включает скрытые файлы
  • od:порядок глубины сначала (уходит перед ветвями, на которых они находятся ).
  • oN:В противном случае не беспокойтесь об упорядочении списка файлов.
  • /:ограничиться файлами типа каталог.
  • e['expression']:ограничиться файлами, для которых код expressionвозвращает true (, внутри которых текущий путь к файлу хранится в$REPLY).
  • $REPLY:t:хвост (базовое имя )файла
  • $REPLY:h:t:хвост головы (имя каталога )файлов)

С bash4.4+ и GNU findили findили большинством BSD вы можете сделать что-то подобное с:

shopt -s nullglob dotglob
readarray -td '' dirs < <(
  LC_ALL=C find. -depth -regex '.*\(/[^/]*\)\1' -type d -print0
)
for d in "${dirs[@]}"; do
  contents=("$d"/*)
  (( ${#contents[@]} == 0 )) ||
    mv -- "${contents[@]}" "${d%/*}/" &&
    rmdir -- "$d"
done

На этот раз с использованием регулярного выражения для сопоставления файлов ./path/to/dir/dirс использованием базового регулярного выражения обратно -ссылок.

3
28.07.2021, 11:27

Попробуйте это на основе GNU findv4.8.0 и Bash v5.1.8

Часть 1 :Разбор дерева каталогов + обнаружение вложенных -дубликатов имени каталога

Предположим, что определенный каталог в вашем дереве имеет следующую структуру:

./
|__test1/
     |__dirname with space
     |           |__test2
     |                |__ test2
     |__dirname **
     |       |__test1
     |
     |__reboot
     |     |__test1
     | 
     |__test2/
          |__test3/
               |__test2/
                    |__test1/
                         |__test1/

(Странные имена каталогов используются для демонстрации безопасности кода.)

Вы видите, что некоторые подкаталоги -(подкаталоги )повторяются по-разному. Некоторые повторяются несколько раз, а не только один раз (, например. test1), один не повторяется (test3), и они могут повторяться либо как родительский и дочерний, либо разделены произвольным числом промежуточных подкаталогов.

Приведенный ниже код детально выявляет повторяющиеся имена подкаталогов в структуре каталогов.

  • он анализирует дерево файлов для структуры подкаталога, начиная с$PWD
  • он находит дубликаты для каждого компонента любого пути подкаталога 2 или более уровней, не считая корневого уровня, которым является $PWD. В моем эксперименте самый длинный путь к подкаталогу — :./test1/test2/test1/test3/test2/test1/test1
  • он печатает первый дубликат подкаталога, найденный на каждом уровне подкаталога, начиная с листа, т. е. читая путь подкаталога справа налево.
  • печать перенаправляется к файлу в обратном порядке, поэтому сначала отображается самый длинный путь к подкаталогу. Две последовательные точки с запятой разделяют компоненты пути (слева от ";;" ), от первого дубликата (справа от ";;" )найдено по предыдущему пункту.

[Код]

$ find./* -type d -exec bash -c 'set -o noglob; IFS="/" subdir=($(printf "%s " "$1")); dirlevels=$((${#subdir[@]}-1)); dupe="$(awk '\''!($1 in sd) {sd[$1];next} {print $1}'\'' < <(printf "%s\n" ${subdir[@]:1}))";[ $dirlevels -ge 2 ] && [ ! -z "$dupe"  ] && (printf "%s/" "${subdir[@]:1}";printf " ;; %s\n" "$(tail -n 1 < <(printf "%s\n" "$dupe"))";)' shellexec {} \; | tac >| tmp.data

$ cat -n  tmp.data

1 test1/reboot/test1/ ;; test1
2 test1/dirname with space/test2/test2/ ;; test2
3 test1/test2/test1/test3/test2/test1/test1/ ;; test1
4 test1/test2/test1/test3/test2/test1/ ;; test1
5 test1/test2/test1/test3/test2/ ;; test2
6 test1/test2/test1/test3/ ;; test1
7 test1/test2/test1/ ;; test1
8 test1/dirname **/test1/ ;; test1

Часть 2 :Обработка дубликатов имен подкаталогов; движущееся содержимое

Обработка выполняется в порядке, указанном в tmp.data.

  • в первой строке tmp.data, первое дублированное имя на пути ./test1/test2/test1/test3/test2/test1/test1test1. Мы можем перенести его содержимое на самый левый подкаталог с тем же именем:./test1/
  • Как только содержимое было перемещено без затирания существующих файлов в месте назначения, самый правый уровень подкаталога test1удаляется.
  • мы переходим к строке 2 из tmp.dataи повторяем вышеуказанные шаги.
  • и т. д., пока не будут использованы все строки в tmp.data.

На данном этапе вопрос (к автору вопроса :@TomDerks )заключается в том, что делать с правильным -большинством test1/*в строке 6 ? Следует ливсеего содержимое перемещать в самый левый -каталог с таким же именем, который в данном случае является первым уровнем подкаталога на пути? Включает ли «все» файлы в ./test1/test2/test1/, а также подкаталог test3и его содержимое?
Полное решение (Часть 2 )зависит от этого.

2
28.07.2021, 11:27

Теги

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