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

Language agnostic 从目录层次结构以编程方式生成导出脚本的解决方案,language-agnostic,scripting,directory,export,Language Agnostic,Scripting,Directory,Export,我经常有以下场景:为了重现用于报告的bug,我创建了一个小样本项目,有时是一个maven多模块项目。因此,可能有一个目录层次结构,它通常会包含一些小文本文件。标准的程序当然是创建一个zip文件并发送它。但是在一些邮件列表上不允许附件,所以我正在寻找一种方法来自动创建一个安装脚本,我可以将它发布到这样的邮件列表中 基本上,我只喜欢Unix风格,它创建mkdir语句来创建目录,创建>语句来编写文件内容。(实际上,除了相对路径分隔符之外,windows和unix版本可能是相同的) 有这样的工具吗?如果

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

基本上,我只喜欢Unix风格,它创建
mkdir
语句来创建目录,创建
>
语句来编写文件内容。(实际上,除了相对路径分隔符之外,windows和unix版本可能是相同的)

有这样的工具吗?如果不是,我可能会用java编写一个,但我很乐意接受各种语言的解决方案


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

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

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

shar `find somedirectory -print` > archive.sh

如果您使用的是GNU sharutils,并且希望创建“普通”归档文件,这些归档文件只使用最可移植的shell内置程序,
mkdir
sed
,那么您应该将其作为
shar-V
调用。您可以使用
-xQ
,从脚本中删除一些额外的负担
-x
删除对现有文件的检查,以及
-Q
删除存档中的详细输出

shar -VxQ `find somedir -print` > archive.sh
如果你真的想要更简单的东西,这里有一个非常简单的
shar
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

您仍然需要调用
sed
,因为您需要某种方法来确保here文档中没有以分隔符开头的行,这将关闭文档并导致后面的行被解释为脚本的一部分。我想不出任何真正好的方法来解决仅使用shell内置的报价问题,因此您将不得不依赖
sed
(它在任何类似Unix的系统上,几乎永远都是如此)。

如果您的问题是非文本文件讨厌过滤器:

在被遗忘已久的年代,我们使用uuencode通过8位进食继电器- 这是不是一种摆脱附件吃掉邮箱的方法? 那么为什么不压缩和编码呢?
(或base64,它是它的表弟)

虽然这很好,但它对目标系统上必须安装什么进行了假设。我希望脚本能够处理给定平台的每个标准系统上可用的内容(平台抽象为:a)任何带有x[linux、bsd、macos等]或b)win2k以来的任何windows)如果您使用GNU sharutils,您可以使用
shar-V
生成“普通”shar归档,它只依赖于基本的shell内置、
mkdir
sed
。我在Mac OS X上测试的shar(FreeBSD shar)只会创建普通的shar文件。听起来不错,我明天会看一看。我以不同的方式解决了我原来的问题,所以我没有来调查这个问题。不过,我会记住它,并接受它作为正确的答案。谢谢是的,这是根本问题的解决方案,谢谢。但这并不是我问题的答案:-)我已经更新了我的答案,以回应你对它的反对。我的回答是否涵盖了您需要的内容,如果没有,您能否澄清如何回答?(我并没有试图让某些东西可以移植到Windows,因为听起来好像在Windows上运行不是一项要求)。
find somedir -print | simpleshar > archive.sh