Скопировать несколько файлов и создать целевые каталоги одновременно?

В Интернете, включая локальные сети, машины называют друг друга IP-адресами. Для доступа к машине B от машины использование названия машины B, машина A должна иметь некоторый способ отобразить название B к его IP-адресу. Существует три способа объявить названия машины на A:

  • файл hosts. Это - простой текстовый файл, который отображает имена к адресам.
  • система доменных имен (DNS). Это - метод, используемый в глобальном Интернете. Например, при загрузке этой страницы в браузере первая вещь, которую делает компьютер, состоит в том, чтобы сделать запрос DNS для знания адреса unix.stackexchange.com.
  • другие базы данных имени, такие как NIS, LDAP или Active Directory. Они используются в некоторых корпоративных сетях, но не очень часто (много сетей, которые используют NIS, LDAP или AD для пользовательских баз данных используют DNS для названий машины). Если Ваша сеть использует один из них, Вы имеете профессионального администратора сети и должны спросить его, что сделать.

Существует много путей, которыми они могут работать на практике; невозможно покрыть их всех. В этом ответе я опишу несколько общих ситуаций.

Файл hosts

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

Файл hosts является простым списком строк, отображающих имена к IP-адресам. Это похоже на это:

127.0.0.1       localhost localhost.localdomain
198.51.100.42   darkstar darkstar.bands

В системах Unix файл hosts /etc/hosts. В Windows это c:\windows\system32\drivers\etc\hosts. Примерно каждая операционная система, которую можно подключить к Интернету, имеет подобный файл; Википедия имеет список.

Добавить запись для B в файле hosts A:

  1. Определите IP-адрес B. На B, выполненном команда ifconfig (если команда не найдена, попробовать /sbin/ifconfig). Вывод будет содержать строки как это:

    eth1      Link encap:Ethernet  HWaddr 01:23:45:67:89:ab
              inet addr:10.3.1.42  Bcast:10.3.1.255  Mask:255.255.255.0
    

    В этом примере IP-адрес B 10.3.1.42. Если существуют несколько inet addr: строки, выберите ту, которая соответствует Вашей сетевой плате, никогда lo запись или туннель или виртуальная запись.

  2. Отредактируйте файл hosts на A. Если A выполнит некоторую систему Unix, то необходимо будет отредактировать /etc/hosts как суперпользователь; посмотрите, Как я выполняю команду как системный администратор (корень).

DHCP+DNS в сетях домашнего или малого офиса

Этот метод является безусловно самым простым, если у Вас есть необходимое оборудование. Только необходимо настроить одно устройство, и все компьютеры будут знать об именах друг друга. Этот метод предполагает, что Ваши компьютеры получают свои IP-адреса по DHCP, который является методом для компьютеров для автоматического получения IP-адреса, когда они соединяются с сетью. Если Вы не знаете, каков DHCP, они, вероятно, делают.

Если Ваша сеть имеет домашний маршрутизатор, это - лучшее место для конфигурирования названий машин, подключенных к тому маршрутизатору. Во-первых, необходимо выяснить MAC-адрес B. Каждое сетевое устройство имеет уникальный MAC-адрес. На B, выполненном команда ifconfig -a (если команда не найдена, попробовать /sbin/ifconfig -a). Вывод будет содержать строки как это:

    eth1      Link encap:Ethernet  HWaddr 01:23:45:67:89:ab

В этом примере MAC-адрес 01:23:45:67:89:ab. Необходимо выбрать строку HWaddr, которая соответствует сетевому порту, это подключено к маршрутизатору через кабель (или карта Wi-Fi, если Вы соединены по Wi-Fi). Если у Вас есть несколько записей, и Вы не знаете, который является, который, включите кабель и посмотрите, какое сетевое устройство получает IP-адрес (inet addr строка чуть ниже).

Теперь, на веб-интерфейсе Вашего маршрутизатора, ищите установку как “DHCP”. Название и местоположение установки абсолютно зависит от модели маршрутизатора, но большинство имеет подобный набор основных настроек. Вот то, на что это похоже на Томатном встроенном микропрограммном обеспечении:

tomato screenshot

Введите MAC-адрес, IP-адрес и желаемое имя. Можно выбрать любой IP-адрес на диапазоне адресов локальной сети. Большинство домашних маршрутизаторов предварительно сконфигурировано для диапазона адресов формы 192.168.x.y или 10.x.y.z. Например, на Томатном маршрутизаторе, показанном выше, на вкладке “Network”, существует “IP-адрес маршрутизатора”, устанавливающий со значением 10.3.0.1 и установкой “маски подсети” со значением 255.255.255.0, что означает, что компьютеры в локальной сети должны иметь адрес формы 10.3.0.z. Существует также диапазон адресов для автоматически присвоенных адресов DHCP (10.3.0.129-10.3.0.254); для Вашего вручную присвоенного адреса DHCP выберите тот, который не находится в этом диапазоне.

Теперь подключите B к сети, и это должно получить IP-адрес, который Вы указали, и это будет достижимо указанным именем от любой машины в сети.

Сделайте свой собственный сервер DNS с Dnsmasq

Если у Вас нет способного домашнего маршрутизатора, можно настроить ту же функциональность на любой машине Linux. Я объясню, как использовать Dnsmasq для установки DNS. Существует много других подобных программ; я выбрал Dnsmasq, потому что легко настроить и легкий вес (это - то, что Томатный маршрутизатор проиллюстрировал выше использования, например). Dnsmasq доступен на большей части Linux и дистрибутивов BSD для ПК, серверов и сетевого оборудования.

Выберите компьютер, это всегда включено, который имеет статический IP-адрес, и это запускает некоторый Linux или BSD; давайте звонить, это (для сервера). На S, установка dnsmasq пакет (если это уже не там). Ниже я предположу, что конфигурационный файл /etc/dnsmasq.conf; местоположение может варьироваться на некотором распределении. Теперь необходимо сделать несколько вещей.

  • Скажите Dnsmasq служить своим именам хостов в дополнение к тем, которых это получает от Интернета. Самый простой путь состоит в том, чтобы ввести имена и IP-адреса в /etc/hosts (см. раздел “Hosts file” выше), и удостоверьтесь это /etc/dnsmasq.conf не имеет no-hosts директива не прокомментирована. (Строки, которые начинаются с a # комментируются.) Можно поставить имена в другом файле; если Вы делаете, поместите строку addn-hosts=/path/to/hosts/file в /etc/dnsmasq.conf.
  • Скажите Dnsmasq, как получить IP-адреса для названий машин в Интернете.

    • Если Вы выполняете Debian, Ubuntu или производную, устанавливаете resolvconf пакет. В наиболее распространенных случаях все будет работать из поля.
    • Если Ваш администратор сети или Ваш ISP дали Вам адреса серверов DNS, введите их в /etc/dnsmasq.conf, например:

      server=8.8.8.8
      server=8.8.4.4
      
    • Если Вы не знаете, каковы Ваши текущие настройки DNS, посмотрите в файле /etc/resolv.conf. Если Вы видите строку как nameserver 8.8.8.8, поместите строку server=8.8.8.8 в /etc/dnsmasq.conf. После изменения /etc/dnsmasq.conf, перезапуск Dnsmasq. Команда, чтобы сделать, который зависит от распределения; типичные возможности включают restart dnsmasq или /etc/init.d/dnsmasq restart.

  • Скажите S использовать услуги Dnsmasq для всех запросов имени хоста. Отредактируйте файл /etc/resolv.conf (как корень), удалите каждый nameserver строка, и помещенный nameserver 127.0.0.1 вместо этого.
    • Если Вы используете resolvconf на Debian или Ubuntu, /etc/resolv.conf может быть субоптимальным, если Вы установили resolvconf пакет с сетью и выполнением. Удостоверьтесь что файлы base, head и tail в /etc/resolvconf/resolv.conf.d/ каталог не содержит никого nameserver записи, затем выполненные resolvconf -u (как корень).
  • Скажите другим машинам использовать S в качестве сервера DNS.Править /etc/resolv.conf и замените все nameserver строки с синглом nameserver 10.3.0.2 где 10.3.0.2 IP-адрес S (см. выше для того, как узнать IP-адрес S).

Можно также использовать Dnsmasq в качестве сервера DHCP, так, чтобы машины могли получить адрес, соответствующий их имени автоматически. Это выходит за рамки этого ответа; консультируйтесь с документацией Dnsmasq (это не трудно). Обратите внимание, что может только быть единственный сервер DHCP в данной локальной сети (точное определение локальной сети выходит за рамки этого ответа).

Имена в глобальном Интернете

До сих пор я принял локальную сеть. Что, если Вы хотите дать имя машине, это находится в другом углу мира? Можно все еще использовать любой из методов выше, за исключением того, что части, включающие DHCP, только применимы в локальной сети. С другой стороны, если Ваши машины имеют общедоступные IP-адреса, можно зарегистрировать собственное общедоступное имя их. (Можно присвоить частный IP-адрес общедоступному имени, также; это менее распространено и менее полезно, но нет никакой технической трудности.)

Получение собственного доменного имени

Можно получить собственное доменное имя и присвоить IP-адреса именам хостов в этом домене. Необходимо зарегистрировать доменное имя в поставщике доменного имени; это обычно стоит $10-15/лет (за самые дешевые домены). Используйте свой веб-интерфейс поставщика доменного имени для присвоения адресов именам хостов.

Динамический DNS

Если Ваши машины имеют динамический IP-адрес, можно использовать динамический протокол DNS для обновления IP-адреса, связанного с названием машины, когда адрес изменяется. Не все поставщики доменного имени поддерживают динамический DNS, так магазин перед покупкой. Для персонального использования, без IP, обеспечивает бесплатную динамическую службу DNS, если Вы используете их собственные домены (например. example.ddns.net).

2
13.04.2017, 15:36
2 ответа

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

$ copy() { mkdir -p -- "${@: -1}" && cp -- "$@" ; }
$ copy * ../b/c/d/

Примечание: он работает с Bash, KSH93 и ZSH.

«$ {@: -1}» соответствует форме $ {Parameter: Offset} : все параметры, начиная с смещения. Смещение -1 соответствует последнему параметру, поскольку отрицательные смещения подсчитываются от конца. Пространство необходимо, в противном случае это было бы $ {PARAMETER: -WORD} . Смотрите руководство Bash для получения дополнительной информации.

«$ @» расширяется до списка параметров, что является то, что требуется для CP .

Примечание 2: Как предложено Mikeserv, вы можете использовать

eval 'mkdir -p -- "${'"$#"'}"'

, который является более портативным (POSIX), вместо

mkdir -p -- "${@: -1}"

, касающихся характеристики, решение Eval намного быстрее с Bash 4.3. 30, но другой раствор быстрее с KSH 93U + и ZSH 5.0.6 (KSH93 и ZSH намного быстрее, чем bash в обоих случаях); и dash 5.7 с решением решение (другой не поддерживается) немного быстрее, чем ksh93 с решением «$ {@: -1}» . Таким образом, в зависимости от вашего дела (скрипта, интерактивное использование, поддержка специфических функций оболочки и т. Д.) Сделайте свой выбор ... Обратите внимание, однако, что в контексте CP (который займет большую часть времени ), эти различия в производительности не будут заметны.

Сценарий, который я использовал для теста:

i=50000
while [ $i -ne 0 ];
do
  # : "${@: -1}"
  eval ': "${'"$#"'}"'
  i=$((i-1))
done

(комментировать EVAL , и растремиться к предыдущей строке для другого решения), называется:

time sh ./tst `seq 1000`
time bash ./tst `seq 1000`
time ksh93 ./tst `seq 1000`
time zsh ./tst `seq 1000`
2
27.01.2020, 22:13

У меня была такая же проблема, и я использовал tarдля ее решения! Вот так:

tmpfile=/tmp/myfile.tar
files="/some/folder/file1.txt /some/other/folder/file2.txt"
targetfolder=/home/you/somefolder

tar --file="$tmpfile" "$files"​
tar --extract --file="$tmpfile" --directory="$targetfolder"

В этом случае tarавтоматически создаст для вас все (подпапки )! Лучший,

Наби

0
04.08.2020, 11:14

Теги

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