mkdir -p awk输入

时间:2011-11-07 13:45:48

标签: bash shell unix awk mkdir

我想为mkdir -p创建一个输入参数,我在一个服务器中有一个目录树结构,我想使用mkdir -p命令将这个相同的结构复制到另一台机器上。这两台机器没有相互“对话”,没有telnet,没有ssh。目标是在安装脚本中插入一个简单的命令(mkdir -p master / {one / {a,b,c},two / {a,b,c},three / {a,b,c}})在server2中,我不想要额外的文件,我无法从server2访问server1。

像master / {one / {a,b,c},two / {a,b,c},three / {a,b,c}}之类的东西。我正在使用(找到。-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 个答案:

答案 0 :(得分:1)

如果你想要cp一个现有的dir结构,你可以考虑使用tar和untar。 tar也可以与find一起使用。

一些例子,只是展示我的意思。

现有服务器上的

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

<强>更新

如果你更喜欢将文件复制到serverB并触发它,这是另一个肮脏的解决方案:

服务器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上运行

答案 1 :(得分:0)

我希望我理解你的需求:将directorys树从server-A复制到server-B,所以

在服务器-A上:

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

答案 2 :(得分:0)

这个find / sort / 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命令。 它不会产生最有效的表达式,但如果使用不同的排序,这可能会得到改善。