我需要创建一个生成特殊“档案”的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
因此,基本上,如果您要执行此捆绑包脚本,那么您最终会得到与生成捆绑包时完全相同的目录结构和文件内容。现在,只需要写一个 迭代所有文件和目录并创建的程序 每个的适当输出。对于文本文件,您可以处理它们 用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脚本:
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。谢谢。人
答案 0 :(得分:1)
使用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