linux - 归档重新生成 shell 脚本

标签 linux bash shell unix sed

我需要创建一个 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 时完全相同的目录结构和文件内容。现在,只需要写一个 遍历所有文件和目录并创建的程序 每个的适当输出。对于文本文件,您可以处理它们 使用 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 命令通过电子邮件发送给 friend ,然后当他在他的机器上执行 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

关于linux - 归档重新生成 shell 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19368940/

相关文章:

linux - 使用 sed 删除行

java - 将 bash 脚本的返回代码和状态获取到 Java 文件中

bash - 将 Zsh 历史保存到 ~/.persistent_history

linux - 删除几乎没有差异的重复行

linux - 如何做差异的反面?

linux - 使用触摸屏和 tslib 的数据流是怎样的?

linux - cat/dev/null 到多个文件以清除日志等现有文件

linux - grep 单词 if 与条件匹配

linux - CHECK_GEARMAN CRITICAL - 函数 'BulkEmail' 未在服务器中注册

linux - Shell 命令获取访问日期/时间最少的目录