2011-11-07 41 views
2

我想爲mkdir -p創建一個輸入參數,我在一臺服務器上有一個目錄樹結構,我想使用mkdir -p命令將這個結構複製到另一臺機器上。這兩臺機器不互相「對話」,沒有telnet,也沒有ssh。其目的是在安裝腳本中插入一個簡單的命令(mkdir -p master/{one/{a,b,c},two/{a,b,c},three/{a,b,c}})在server2中,我不想要一個額外的文件,並且我無法從server2訪問server1。mkdir -p awk輸入

類似master/{one/{a,b,c},two/{a,b,c},three/{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}} 
+0

請您澄清一下。你是否已經有了一個結構,你想找到能夠重現現有結構的mkdir -p的參數? –

+0

是Steve Weet。問題是將相同的結構從現有的服務器複製到新的服務器。 – odew

+0

你想要達到什麼目的?你真的需要生成你正在展示的模式,還是擴展版本? (因爲獲得擴展版本是微不足道的;它只是find和shell的輸出將擴展您在mkdir看到它之前所寫的內容) –

回答

1

如果你想要一個現有的dir結構,你可以考慮使用tar和untar。 tar也可以和你的find一起工作。

舉一些例子,只是說明我的意思。

在現有serverA的:

find .... -print |xargs tar -cf - |ssh [email protected]_B "cd someDir; tar -xf - " 

更新如果你喜歡將文件複製到ServerB並啓動它

,這裏還有一個骯髒的解決方案:

在serverA:

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到目標目錄,然後基於B

+0

肯特,我認爲有很多方法可以做到這一點。我想要做的是在腳本中放入一個命令,並生成與另一個服務器目錄樹對應的目錄樹。我不想有一個額外的tar文件。我想在命令行中執行此操作。 – odew

+0

@odew,現在看看我的更新答案。 – Kent

+0

彼此之間沒有ssh。 – odew

0

我希望我理解您的需求運行:從服務器副本directorys樹到服務器B,所以

在服務器-A:

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

此查找/排序/ 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命令。 它不會產生最有效的表達式,但是如果使用不同的排序,這可能會得到改進。