mkdir -p awk input - PullRequest
       34

mkdir -p awk input

2 голосов
/ 07 ноября 2011

Я хочу создать входной аргумент для mkdir -p, у меня есть одна структура дерева каталогов на одном сервере, и я хочу скопировать эту же структуру на другой компьютер с помощью команды mkdir -p.Эти две машины не «общаются» друг с другом, ни telnet, ни ssh.Цель состоит в том, чтобы вставить простую команду (mkdir -p master / {one / {a, b, c}, два / {a, b, c}, три / {a, b, c}}) в сценарий установкив server2 мне не нужен дополнительный файл, и я не могу получить доступ к server1 с server2.

Что-то вроде master / {one / {a, b, c}, два / {a, b, c}, три / {a, b, c}}.Я использую (find. -Type d), чтобы найти каталоги, и теперь мне нужна часть awk.

Каков наилучший способ создания команды awk для поиска древовидной структуры?

Directory tree:

-- master
----one 
--------a
--------b
--------c
----two
--------a
--------b
--------c
----three
--------a
--------b
--------c    

Mkdir command:

mkdir -p master/{one/{a,b,c},two/{a,b,c},three/{a,b,c}}

Ответы [ 3 ]

1 голос
/ 07 ноября 2011

если вы хотите скопировать существующую структуру dir, вы можете использовать tar и untar.tar может работать и с вашим find.

ну, например, просто покажите, что я имел в виду.

на вашем существующем сервере A:

find .... -print |xargs tar -cf - |ssh user@SERVER_B "cd someDir; tar -xf - "

обновлено

Если вы предпочитаете скопировать файл на сервер B и запустить его, вот еще одно грязное решение:

на сервере A:

kent$  mkdir a/b/{1..5}/c  

now we have a tree, then :
kent$  find -type d|sed -r '/^.$/{s:.:#!/bin/bash:};{s/^\./mkdir -p &/}' 
#!/bin/bash
mkdir -p ./a
mkdir -p ./a/b
mkdir -p ./a/b/4
mkdir -p ./a/b/4/c
mkdir -p ./a/b/3
mkdir -p ./a/b/3/c
mkdir -p ./a/b/1
mkdir -p ./a/b/1/c
mkdir -p ./a/b/5
mkdir -p ./a/b/5/c
mkdir -p ./a/b/2
mkdir -p ./a/b/2/c

теперь вы можете сохранитьвывод в файл сценария, на B перейдите к целевому DIr, затем запустите его на B

0 голосов
/ 09 ноября 2011

Этот поиск / сортировка / GNU sed oneliner делает старт:

mkdir -p master/{one,two,three}/{a,b,c}
find master -type d | sort |
sed -r 'H;${x;s/\n//;y/\n/ /;:a;s/([^ ]*) (\1\/[^ ]* )/\2/;ta;:b;s#(([^ /]*/)+)([^ /]+) \1([^ /]+)#\1\3,\4#;tb;s#(([^ /]*/)*)([^ ]*)#\1{\3}#g;:c;s#(([^ /]*/)*)([^/ ]+)/(\{[^}]*\}) \1([^ /]+)/\4#\1\3,\5/\4#;tc;s#/([^/ ]*)/\{#/{\1}/{#g;s/^/mkdir -p /p};d'
mkdir -p master/{one,three,two}/{a,b,c}

Это немного длинновато, чтобы объяснить, но по сути это превращает отсортированный список каталогов в строку. Затем использует циклы и сопоставление, чтобы сжать их обратно в выражение. Наконец, он добавляет команду mkdir -p. Он не дает наиболее эффективного выражения, но его можно улучшить, если использовать другой вид.

0 голосов
/ 07 ноября 2011

Надеюсь, я понимаю ваши потребности: скопируйте дерево каталогов с сервера A на сервер B, поэтому

На сервере A:

cd /path/to/dir
find -type d | ssh server-B 'xargs -I% mkdir -p "/path/to/dir/%"'
...