归档重新生成shell脚本

我需要创build一个生成特殊“档案”的shell程序。 这些档案也将是shell脚本,所以它们可以用“sh”来执行。

比方说,我有一些目录结构:

mydir +- file.txt +- mysubdir +- foo.txt 

file.txt包含“lorem ipsum”,foo.txt包含“foo bar”。

然后执行存档程序:

$ arch.sh mydir> bundle.sh

应该生成一个名为“bundle.sh”的文件,可能看起来像这样:

 if [ \! -d mydir ] ; then mkdir mydir cd mydir if [ -f file.txt ] ; then touch file.txt echo "lorem ipsum" >> file.txt fi if [ \! -d mysubdir ] ; then mkdir mysubdir cd mysubdir if [ -f foo.txt ] ; then touch foo.txt echo "foo bar" >> foo.txt fi fi fi 

所以,基本上,如果你要执行这个bundle脚本,那么你将得到完全相同的目录结构和文件内容,当你生成的包。 现在,只需要编写一个迭代所有文件和目录的程序,并为每个文件和目录创build适当的输出。 对于文本文件,可以使用sed处理它们以将文本文件中的每一行转换为shell命令。 例如,如果该文件如下所示:

 Foo Bar Baz Goo 

然后你可以生成下面的shell命令:

 echo "Foo" >> example.txt echo "Bar" >> example.txt echo "Baz" >> example.txt echo "Goo" >> example.txt 

对于二进制文件,你应该使用“uuencode”,也许你也可以使用“base64”,例如,当你有一个二进制文件“file.bin”,然后执行以下命令输出一个shell脚本,重新创build二进制文件:

 base64 file.bin | sed 's/.*/echo\ \0 >> file.txt/g' echo "base64 -d file.txt > file.bin" echo "rm file.txt" 

所以通过这种方式,我可以将bundle.sh命令发送给一个朋友,然后当他在他的机器上执行bundle.sh时,他将生成与mydir完全相同的目录结构。

我想知道如何执行遍历遍历目录以及如何获取每个文件的名称,以及如何将我生成的所有shell命令捆绑到bundle.sh。 谢谢。 家伙。

使用makeself :

 $ cd /path/to/dir $ ls main.sh dir1 dir2 dir3 $ makeself . ../bundle.run "Creating a bundle with makeself" ./main.sh 

main.sh是主要的脚本。 该包将包含完整的递归目录和主脚本。

运行包:

 chmod +x bundle.run ./bundle.run