代码之家  ›  专栏  ›  技术社区  ›  Sean Patrick Floyd

以编程方式从目录层次结构生成导出脚本的解决方案

  •  0
  • Sean Patrick Floyd  · 技术社区  · 16 年前

    我经常有以下场景:为了重现一个用于报告的bug,我创建了一个小样本项目,有时是一个Maven多模块项目。所以可能有一个目录层次结构,它通常包含一些小的文本文件。标准的过程当然是创建一个zip文件并发送它。但是在某些邮件列表中不允许使用附件,因此我正在寻找一种自动创建安装脚本的方法,我可以将其发布到此类邮件列表中。

    基本上,我会很高兴有一个Unix风格的 mkdir 用于创建目录和 >> 用于写入文件内容的语句。(实际上,除了相对路径分隔符之外,Windows和Unix版本可能是相同的)

    这种工具是否存在于某个地方?如果不是,我可能会用Java编写一个,但是我很乐意接受各种语言的解决方案。

    (该工具可以在Windows或Unix下运行,但生成脚本的目标平台应该是Unix或可配置的)

    2 回复  |  直到 16 年前
        1
  •  1
  •   Brian Campbell Dennis Williamson    16 年前

    我想你在找 shar ,它创建一个shell归档文件(shell脚本,运行时该脚本生成一个给定的目录层次结构)。它在大多数系统上都可用;您可以使用 GNU sharutils 如果你还没有。

    打包目录树的正常用法如下:

    shar `find somedirectory -print` > archive.sh
    

    如果您正在使用gnu sharutils,并且想要创建“普通”的档案,这些档案只使用最可移植的shell builtin, mkdir 和 sed ,然后您应该调用它作为 shar -V . 您可以使用 -xQ ; -x 删除对现有文件的检查,以及 -Q 从存档中删除详细输出。

    shar -VxQ `find somedir -print` > archive.sh
    

    如果你真的想要更简单的东西,这里有一个非常简单的版本 沙尔 作为shell脚本。它在标准输入中使用文件名,而不是参数,以简化操作并使其更加健壮。

    #!/bin/sh
    
    while read filename 
    do 
        if test -d $filename
        then
            echo "mkdir -p '$filename'"
        else
            echo "sed 's/^X//' <<EOF > '$filename'"
            sed 's/^/X/' < "$filename"
            echo 'EOF'
        fi
    done
    

    调用如下:

    find somedir -print | simpleshar > archive.sh
    

    您仍然需要调用 塞德 ,因为您需要某种方法来确保此处文档中没有以分隔符开头的行,这将关闭文档并导致后面的行被解释为脚本的一部分。我想不出任何真正有效的方法来解决只使用外壳内置的报价问题,因此您必须依赖 塞德 (这是 standard 在任何类似于Unix的系统上,而且几乎是永久的)。

        2
  •  0
  •   blabla999    16 年前

    如果您的问题是不含文本文件的筛选器:

    在很久以前被遗忘的时间里,我们使用uuencode来绕过8位饮食中继。- 这是一种克服这些天吃附件的邮箱的方法吗? 那么为什么不压缩和Uuencode呢? (或者base64,它的表弟)