寻找一个从一组文件创建纯文本 tarball 的工具,它们可以在电子邮件正文中邮寄

寻找一个从一组文件创建纯文本 tarball 的工具,它们可以在电子邮件正文中邮寄

我正在寻找一种命令行工具,它需要一个 tarball,对其进行解压缩和解包,然后将内容转换为一个连续的文件,该文件由最多 80 个字符宽的行组成,以便可以将其作为纯文本进行邮寄,而无需腐败。

感谢您向我指出这样的工具。

谢谢。

答案1

这是一个答案 - 可能会做你想做的事:

tar xf tarball-test.tar.gz --to-stdout | fold -w 80 -s > output.txt 

# alternative: 

tar zxOf tarball-test.tar.gz | fold -w 80 -s > output.txt 

我在这个例子中使用了 GNU tar,但是上面的咒语之一应该适用于其他tar实现。

fold注意,该-s选项会在空格处中断 - 如果存在的话。请参阅此问答的替代品和选项fold

您可以通过创建一些文件并制作 tarball 来测试这一点:

$ for i in {1..25}; do printf 'file1' >> file1.txt; done
$ for i in {1..30}; do printf 'xxfile2' >> file2.txt; done
$ for i in {1..20}; do printf 'file3 ' >> file3.txt; done
$ tar -czf tarball-test.tar.gz file1.txt file2.txt file3.txt

请注意,上面创建的文件不包含换行符。这是不寻常的,但我不想对OP的文件做出假设。但是,使用此类(非分隔)文件会导致行为fold未定义。否则,为避免此风险,请创建带有换行符的文件,如下所示。

$ for i in {1..25}; do printf 'file1' >> file1.txt; done; printf '\n' >> file1.txt
$ for i in {1..30}; do printf 'xxfile2' >> file2.txt; done; printf '\n' >> file2.txt
$ for i in {1..20}; do printf 'file3 ' >> file3.txt; done; printf '\n' >> file3.txt
$ tar -czf tarball-test.tar.gz file1.txt file2.txt file3.txt

答案2

它按照要求进行,将其保存到concat_mailer.sh

#!/bin/bash

# extract .tar file containing .txt--merge, format, e-mail

time_stamp=$(date +"%Y-%m-%d_%H:%M:%S")
cat_file="concat_[$time_stamp]"

tar -x -f "$1"

# create single plain text file
for text in *.txt
 do
  cat "$text" >> "$cat_file.txt"
 done

# delimited text captured for output
cat "$cat_file.txt" | fold -w 80 > temp.txt

mv history.log to_append.txt
echo -e "[ "$time_stamp" ] "$1"\n" > history.log
cat temp.txt >> history.log
cat to_append.txt >> history.log

# text piped to email body, via stdin
cat temp.txt | msmtp -a default -t [email protected]


if [ $? != 0 ]; then
    echo -e "\n\033[31mFailed.\033[m\n"
else
    echo -e "\n\033[32mSuccess.\033[m\n"
fi

rm *.txt

exit 0

运行此命令(使脚本可执行):
chmod +x concat_mailer.sh
您只需执行一次。

用法:./concat_mailer.sh your_file.tar
在 Fedora 38 上进行测试。

使mail命令工作比我预期的要困难。
我最终制作了这个帮助脚本msmtp 这里

输入以下命令检查mail&&sendmail的路径:msmtp

whereis mail; whereis sendmail; whereis msmtp

我的sendmail恰好在/usr/sbin/.它有所不同。分别将它们更改为您的路径:

sudo ln -f -s /usr/sbin/sendmail /usr/bin/mail

sudo ln -f -s /usr/bin/msmtp /usr/sbin/sendmail

现在,mail&sendmail将用作msmtp他们的MTP服务。

相关内容