【问题标题】:mkdir -p awk inputmkdir -p awk 输入
【发布时间】:2011-12-23 15:36:27
【问题描述】:

我想为 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}} 的东西。我正在使用( 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}}

【问题讨论】:

  • 您能否澄清一下。您是否已经有一个结构,并且您想找到 mkdir -p 的参数来重现现有结构?
  • 是的,史蒂夫·维特。问题是将相同结构从现有服务器复制到新服务器。
  • 您到底想达到什么目标?您是否真的需要生成您正在展示的模式,或者扩展版本会这样做吗? (因为获得扩展版本是微不足道的;它只是 find 的输出,shell 将扩展您在 mkdir 看到之前编写的内容)
  • 目的是把 mkdir -p 和一个模式放在一个 shell 脚本中。
  • 我看不出 awk 应该如何适应这个。

标签: bash shell unix awk mkdir


【解决方案1】:

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

举个例子,说明我的意思。

在您现有的服务器A上:

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 上运行它

【讨论】:

  • 肯特,我认为有很多方法可以做到这一点。我想要做的是将命令放入脚本并生成与另一个服务器目录树相对应的目录树。我不想有一个额外的 tar 文件。我想在命令行中完成。
  • 彼此之间不要有 ssh。
  • 在服务器 A 上:"find -type d > dir-list" 然后将文件发送到服务器 B 并运行:"mkdir -p $(
  • 好吧,你可以发送 dir-list 文本文件,但为什么不能发送 tar?
【解决方案2】:

希望我能理解您的需求:将目录树从服务器 A 复制到服务器 B,所以

在服务器 A 上:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-09
      • 2014-01-27
      • 1970-01-01
      • 2018-09-30
      • 2017-03-15
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      相关资源
      最近更新 更多